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 ="";とする。
書いている間に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";
こちらのサイトは参考になりませんでしょうか?
良かったらご覧になってみて下さい。
回答ありがとうございます。このサイトはすでに確認済みです。
書いている間に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 ="";
$h8_15 =$goods8_height +10;
$table_related[$i] =<<"EOF";
<br$xslash>
<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 は全商品の合計で良いのですよね?
申し訳ありません。変数が多く、ファイルが多岐に渡るため実際にどのように働いているのかはっきりとはわかりません。問題なく動作しているのでこのままでよいと思われます。
多分、サブルーチンにした方が簡潔になると思います。
本当は、もうちょっとコードを書いて分かりやすくしたり汎用的にした方がいいと思いますが…。
間違っていたらごめんなさい。
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さんの回答がより近いものであったためこちらで解決を進めて行きたいと思います。回答のためにお時間を割いていただいたことを大変感謝いたします。
回答ありがとうございます。
ほぼ希望とおりの動作をしたのですが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 ="";
$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 は全商品の合計で良いのですよね?
申し訳ありません。変数が多く、ファイルが多岐に渡るため実際にどのように働いているのかはっきりとはわかりません。問題なく動作しているのでこのままでよいと思われます。