6

Perl では、多くの場合、次のように制御ブロックの使用を避けることができます:

print "$_\n" foreach(@files);

それ以外の:

foreach(@files){
  print "$_\n";
}

この構文は、次のより複雑なケースでどのように機能しますか。

die("Not a file: $_") unless -f $_ foreach(@files);

構文エラーが発生します。難読化したコードを書こうとしているわけではありません。それはプログラムの重要でない部分に過ぎないので、できるだけ簡潔に表現したいと考えています。

要約された回答:

受け入れられた回答として受け入れることができる回答は 1 つだけですが、Chris と Jon からの次の回答が一番気に入っています。

これはforeach私が意図したとおりに使用しますが、なしでsyntax error:

-f or die "Not a file: $_" foreach @files;

そして、次のものは少なくとも同じくらい良いです。私はそれdieがステートメントの冒頭にあるのが好きです。なぜなら、それは読者の注意が向けられるべきものだからです:

die("Not a file: $_") for grep {!-f} @files;
4

7 に答える 7

13

Perlish (TMTOWTDI) にするために、ロジックの短絡を使用できます。

-f or die "Not a file: $_" foreach @files;

OS X でテスト済みで動作します。

補足として、Perl で見-f or dieられる多くの一般的な構成要素のように見えますが、 (私が思うに) それでも (特定の条件下で)行の意図を示しています。open() or diedie

于 2009-02-20T18:01:21.847 に答える
11

@ Brent.Longboroughの回答を使用するか、本当に後置が必要な場合は、次のようにします。

do { die("Not a file: $_") unless -f $_ } foreach(@files);

しかし、これが「重要でない部分」であるからといって、簡潔が優れているとは限らないので、私は他の人に同意します。 読みやすさが重要です。

于 2009-02-20T16:52:08.330 に答える
7

難読化されたコードを書くつもりはないかもしれませんが、そうしようとしているのは確かです。

1 行ではなく 2 行 (または、Brent.Longborough が示唆するように 1 行に 1 ブロックでさえ) はそれほど悪いでしょうか? 正直なところ、これが私が他の人々の perl コードをデバッグ/編集しようとするのを一般的に嫌う理由です.perl で書いている多くの人々は、それを行うのではなく、可能な限り最も「賢い」方法でほとんどすべてを行うことに夢中になっているようです.他の人が読んでも理解しやすいように。

于 2009-02-20T16:47:12.227 に答える
5

エラー テストがこのコードの主要なポイントである場合、行頭に主要な位置を設定することは理にかなっている可能性があります。わずかな改善は、次を使用することgrepです。

die("Not a file: $_") for grep {!-f} @files;

ただし、コードのその部分で他の理由でファイルをループする予定がある場合は、ループの本体に追加することをお勧めします。

于 2009-02-20T17:47:52.347 に答える
3

難読化されたコードを書きたくないのであれば、このように書くべきではありません。あなたは単純であるべきことを理解するのを難しくしています。

于 2009-02-20T16:48:33.300 に答える
1

あなたは一生懸命考えすぎています。ここでは、アクロバットなしで 1 行に表示されます。

 foreach ( @files ) { die( "Not a file!" ) unless -f }

ブロック内のものをいじって調べてみることもできますが、かっこや中かっこを削除しても何の役にも立たず、次にそれを見なければならないプログラマーを混乱させることになるでしょう。

ただし、おそらくもっと複雑なものがあり、これは単なる例です。現実の世界では、さらに簡単になります。

not_a_file_die_die_die( \@files );

次に、すべての複雑なものをサブルーチンに移動します。本当の秘訣は、アイデアを実装するコードではなく、アイデア意図を簡潔にすることです。多くの場合、メカニズムは実際には重要ではありません。あなたは結果をもっと気にします。そのような場合、メカニックを心配しないでください。

于 2009-09-20T18:08:42.673 に答える
0

くそー、ジョンはちょうどgrep.

しかし、もっと大きな質問があります。アレイ内にファイル以外のものが見つかった場合に、実際に救済しようとしているのであれば、どうして重要ではないのでしょうか? (たとえば、これらの項目を削除してユーザーに警告し、残りのリストを処理するのとは対照的です。) シバン全体を強制終了することは、プログラムのかなり重要な部分であると思います。

いずれにせよ、後置修飾子のどちらかの側に 1 つしか持てないため、後置修飾子を正確に使用することはできません。unlessしたがって、と の両方を持つことはできませんforeach。の関連ビットの先頭からperldoc perlsyn:

任意の単純なステートメントには、終了セミコロン (またはブロック終了) の直前にSINGLE修飾子をオプションで付けることができます。

于 2009-02-20T17:53:37.713 に答える