人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

CGI-Perlの質問です。
split関数で、以下のA)の文字列をB)の文字列に変換するにはどうしたらよいでしょうか?
CGIを少しだけカスタマイズしたいのですが、Perlの知識が浅いため、解決方法そのものを教えていただければうれしいです。もしそのまま使える完全なコードややり方を回答していただいた回答者の方には500ポイントを差し上げます。よろしくお願いいたします。
※文字制限のため参考コードなどはこの下にある「この質問・回答へのコメント」に記載いたします。

A)$option、$option2
▼$option
select,選択,0,0:9,9号,5,100:11,11号,6,200:13,13号,3,300:15,15号,1,500:another,指定,,500
▼$option2
select,選択:red,赤:blue,青:green,緑
※$option = "記号,意味,在庫数,単価"、$option2 = "記号,意味"

B)$option_set、$option2_set
▼$option_set
<select name='op1'>
<option value='select'>選択</option>
<option value='9'>9号</option>
<option value='11'>11号</option>
<option value='13'>13号</option>
<option value='15'>15号</option>
<option value='another'>指定</option>
</select>
▼$option2_set
<select name='op2'>
<option value='select'>選択</option>
<option value='red'>赤</option>
<option value='blue'>青</option>
<option value='green'>緑</option>
</select>
※$option、$option2がもし空の場合は$option_set ="";、$option2_set ="";とする。

●質問者: icta
●カテゴリ:ウェブ制作
✍キーワード:Blue CGI GREEN Perl RED
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ritto11
●0ポイント

こちらのサイトは参考になりませんでしょうか?

良かったらご覧になってみて下さい。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k05.htm

◎質問者からの返答

回答ありがとうございます。このサイトはすでに確認済みです。


2 ● mystashes
●500ポイント ベストアンサー

書いている間にkn1967さんのコメントが先に入ってしまったので恐縮ですが...

一応HTMLへのリスト出力以外の部分を考慮したご参考ということで。

変数の頭の"my"は全て削除可能です。

#これ以前で $option_su_ex,$option_su_tani,$option_no,$option2_noが定義されていると考えています
my $i=0;
my $flag_zaiko_non=0;
my $flag_non_option =1;

my @option=split(/:/,$option);
my @option2=split(/:/,$option2);
my $option_set="";
my $option2_set="";

my $zaiko_new=0;
# 以下の変数はリスト出力以外の用途で使用予定有りと考えています。
my $zaiko=0;
my @op_k;
my @op_m;
my @op_su;
my @op_pr;
my @op2_k;
my @op2_m;
my @op2_su;

$i=0;
for (@option) {
 my @value = split(/,/,$_);
 # op_*[$i] が後ほど使用予定無しであれば下の1行は不要です(本ソースコード内では使用していません)
 ($op_k[$i],$op_m[$i],$op_su[$i],$op_pr[$i])=@value;
 next if ($value[0] eq '');
 $flag_non_option=0;
 my $su_ex='';
 my $pr_ex='';
 if ($value[2] > 0) {
 $zaiko_new+=$value[2];
 $su_ex = ($option_su_ex == 1) ? "$value[2]$option_su_tani" : "";
 } else {
 # $flag_zaiko_non はリスト出力以外の用途で使用予定有りと考えています
 # 1商材でも在庫無しのものがあればフラグを立てて良いのですね?
 $flag_zaiko_non=1;
 }
 $pr_ex = ($value[3] ne '') ? "[$value[3]]" : "";
 $option_set=$option_set."<option value='$value[0]'>$value[1]$pr_ex$su_ex</option>\n";
 last if (++$i >= $option_no);
}

$option_set=($option_set ne "") ? "<select name='op1'>\n$option_set</select>" : "";
# 下の print は確認用です。意図通りの出力を確認したら削除してください。
print "$option_set\n";

# $zaiko は全商品の合計で良いのですよね?
if($flag_non_option ne '1'){
 $zaiko=($zaiko_new > 0) ? $zaiko_new : 0;
}

$i=0;
for (@option2) {
 my @value = split(/,/,$_);
 # op2_*[$i] が後ほど使用予定無しであれば下の1行は不要です(本ソースコード内では使用していません)
 ($op2_k[$i],$op2_m[$i],$op2_su[$i])=@value;
 next if ($value[0] eq "");
 $option2_set=$option2_set."<option value='$value[0]'>$value[1]</option>\n";
 last if (++$i >= $option2_no);
}

$option2_set=($option2_set ne "") ? "<select name='op2'>\n$option2_set</select>" : "";
# 下の print は確認用です。意図通りの出力を確認したら削除してください。
print "$option2_set\n";
◎質問者からの返答

回答ありがとうございます。

ほぼ希望とおりの動作をしたのですが2点だけうまくいかないところがあります。

1)valueの値が“記号”ではなく“意味”になる。

<option value='15'>15号</option>と表示させたいのですが<option value='15号'>15号</option>となります。

2)8件表示されるべきところが1件しか表示されない。

以下のコードが実際に使用するコードです。“#ここにコードを挿入”の部分に教えていただいたコードを挿入しましたが、1件しか表示されません。

この原因は教えていただいたコードとは無関係だと思い、試行錯誤したのですが原因を解明できませんでした。

勉強不足で申し訳ありませんが、どこを変更すればよいか教えていただけませんでしょうか?よろしくお願いします。


$t8_width = $t_width/4;

$i =0;

while($i < 8){

$table_related[$i] =<<"EOF";

\

EOF

$i ++;

}

$i =0;

foreach(@CHILD_DATA){

($goods_no,$name,$kigou,$option,$option2,$class,$setumei,$fcolor,$price,$tani,$zaiko,$limit,$picture,$bikou,$aux1,$aux2,$aux3,$aux4,$aux5,$free1,$free2,$free3) = split(/\<\>/,$_);

($price,$tax_ch)= split(/\:/,$price);

if($tax_flag eq ''){

if($tax_ch == 1){

$tax_set ="$tax_komi";

}else{

$tax_set ="$tax_betu";

}

}elsif($tax_flag eq '0'){

$tax_set ="$tax_betu";

}elsif($tax_flag eq '1'){

$tax_set ="$tax_komi";

}elsif($tax_flag eq '2'){

$tax_set ='';

}


#ここにコードを挿入


$price_set = $price;

1 while $price_set =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理

$link_pw ="$modoru_goods&mode=p_wide&id=$goods_no&superkey=1&back=$referer_url_encode";

($pic1,$pic2,$pic3,$pici,$picj) =split(/\|/,$picture);

if($pici eq ""){

$pici ="$default_g";

}

($pici,$w_h_set) =&pic_convert($goods8_width,$goods8_height,$pici,$convert_none_8);

$pici_set ="\"$name\"";

$h8_15 =$goods8_height +10;

$table_related[$i] =<<"EOF";

$pici_set

<br$xslash>

$name

<br$xslash>\\$price_set$tax_set

<form action="$script" method="$post_get">

<input type='hidden' name='g_no' value="$goods_no"$slash>

$option_set$option2_set

<input type="hidden" name="goods" value="$name"$slash>

$zaiko_set$kosuu_setting

<input type='hidden' name='mode' value='look'>

$get_setting

</form>


EOF

if($i == 4){

$related_5_8goods =1;

}

$i ++;

}


以下はご質問の件です。

>商材でも在庫無しのものがあればフラグを立てて良いのですね?

>$zaiko は全商品の合計で良いのですよね?

申し訳ありません。変数が多く、ファイルが多岐に渡るため実際にどのように働いているのかはっきりとはわかりません。問題なく動作しているのでこのままでよいと思われます。


3 ● tkyk3
●50ポイント

多分、サブルーチンにした方が簡潔になると思います。

本当は、もうちょっとコードを書いて分かりやすくしたり汎用的にした方がいいと思いますが…。

間違っていたらごめんなさい。


my $option = "select,選択,0,0:9,9号,5,100:11,11号,6,200:13,13号,3,300:15,15号,1,500:another,指定,,500";

my $option2 = "select,選択:red,赤:blue,青:green,緑";

$option_set = option_html($option, 'op');
$option2_set = option_html($option2, 'op2');

#オプション項目をHTMLに変換する
sub option_html {
my $string = shift;
my $name = shift;
if ($string) { return '';} #何もない場合は空を返す

my @opitons = split(/:/,$string); # :で切り分けて配列へ

print "<select name='$name'>\n";
foreach my $option (@opitons) { #
my @cells = split(/\,/,$option); # ,で切り分けて配列へ
print "<option value='$cells[0]'>'$cells[1]</option>\n";
}
print "</select>\n";
}
◎質問者からの返答

回答ありがとうございます。最初に挙げたコードに準じたものが望ましいというこちらの希望にmystashesさんの回答がより近いものであったためこちらで解決を進めて行きたいと思います。回答のためにお時間を割いていただいたことを大変感謝いたします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ