海外旅行から帰ってきたら、まず何を食べる?

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

A 回答 (4件)

foreach は対応する} までが一セット。


入れ子構造にはできるけど、互い違いにしたり、(やろうとしてるような)複数のforeachに一つの本文、等ということはできません。これはほとんどのプログラミング言語での基本です。

@sorted_key=sort~等としてリストに入れておくとか
「同じ処理」をサブルーチンにするとか
判定用の関数を(関数のリファレンスとかを使って)切り替えられるようにするとか





で、前の質問は無視ですか?
    • good
    • 0

もしかして、こう?



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) {
}
}
    • good
    • 0

構文上そのような事はできません。



foreachのリスト(sort~の部分)を変数にしてしまうとか
一緒の部分をサブルーチン化するとかすればよいかと思います。
    • good
    • 0

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報