• 締切済み

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 文の行だけ変更したいのですが、どうすれば良いですか?

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

foreach は対応する} までが一セット。 入れ子構造にはできるけど、互い違いにしたり、(やろうとしてるような)複数のforeachに一つの本文、等ということはできません。これはほとんどのプログラミング言語での基本です。 @sorted_key=sort~等としてリストに入れておくとか 「同じ処理」をサブルーチンにするとか 判定用の関数を(関数のリファレンスとかを使って)切り替えられるようにするとか で、前の質問は無視ですか?

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

もしかして、こう? 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)
回答No.2

構文上そのような事はできません。 foreachのリスト(sort~の部分)を変数にしてしまうとか 一緒の部分をサブルーチン化するとかすればよいかと思います。

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

中身をサブルーチンにしましょう。

関連するQ&A