1

私はこの構文がとても好きです:

try_something() or warn "Cant do it"; 

の後にコマンドを追加するにはどうすればよいorですか?

たとえば、次のコードで役立ちます。

foreach (@array)
{
   m/regex/ or {warn "Does not match"; next;}  # this syntax is wrong
   ...
}

私が見つけた1つの方法は

try_something() or eval {warn "Can't do it"; next;}; 

しかし、それは悪い考えだと思います。

ベストアンサー:

  1. doよりも優れていevalます。
  2. コンマ演算子はさらに優れています:注意:引数の 1 つとして解析されないように、do_smth() or warn("Does not match"), next;括弧は必須です。warnnext
4

3 に答える 3

6

それはかなり速くかなり読めなくなると思いますが、次のことができますdo

foo() or do { bar(); baz(); };
sub foo {
  return $_[0] == 2;
}

for (1..3) {
  print $_;
  foo($_) or do { print " !foo\n"; next; };
  print " foo!\n";
}
于 2012-05-29T12:30:12.957 に答える
5

あなたの質問の場合、私はunless.

for (@array) {
  unless (/regex/) {
    warn "Does not match";
    next;
  }

  ...
}

コンマ演算子を使用して回避できる場合があります。左側の引数を評価して結果を破棄し、右側の引数を評価してその結果を返します。あなたの状況に適用すると、次のようになります

for (@array) {
  /regex/ or warn("Does not match"), next;

  ...
}

余分な括弧に注意してください。このように、括弧とグループ化にはもう少し注意する必要があります。この手法は慎重に使用してください。すぐに醜くなる可能性があります。

以下のコメントで、Zaid は次のように提案しています。

warn('Does not match'), next unless /regex/;

選択はスタイルの問題です。Perl は言語学者によって作成されました。自然言語は、強調したい部分に応じて、同じ考えを異なる方法で表現することを可能にします。あなたの場合、警告とパターン マッチのどちらを強調しますか? より重要なコードを前に配置します。

于 2012-05-29T12:40:04.283 に答える