- 締切済み
Perl if 文内にforeachを入れる場合
if ($pattern eq 'p2') { foreach $key (sort{ ($re_key{$b} <=> $re_key{$a}) || $b cmp $a } keys %re_key) { } else { foreach $key (sort{ ($b <=> $a) || $b cmp $a } keys %re_key) { } $pattern の選択で検索の種類を切り替えたいのですが、上のように指定するとコンパイルエラーになってしまいます。 foreach 文以降の処理は全く一緒なので、foreach 文の行だけ変更したいのですが、どうすれば良いですか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
foreach は対応する} までが一セット。 入れ子構造にはできるけど、互い違いにしたり、(やろうとしてるような)複数のforeachに一つの本文、等ということはできません。これはほとんどのプログラミング言語での基本です。 @sorted_key=sort~等としてリストに入れておくとか 「同じ処理」をサブルーチンにするとか 判定用の関数を(関数のリファレンスとかを使って)切り替えられるようにするとか で、前の質問は無視ですか?
- kuroizell
- ベストアンサー率55% (95/170)
もしかして、こう? if ($pattern eq 'p2') { foreach $key (sort{ ($re_key{$b} <=> $re_key{$a}) || $b cmp $a } keys %re_key) { } } else { foreach $key (sort{ ($b <=> $a) || $b cmp $a } keys %re_key) { } }
- wormhole
- ベストアンサー率28% (1626/5665)
構文上そのような事はできません。 foreachのリスト(sort~の部分)を変数にしてしまうとか 一緒の部分をサブルーチン化するとかすればよいかと思います。
- notnot
- ベストアンサー率47% (4900/10361)
中身をサブルーチンにしましょう。