11

オンラインで perl コードを調べていたところ、見たことのないものに出会い、それが何をしているのか (もしあれば) わかりませんでした。

if($var) {{
   ...
}}

二重中括弧の意味を知っている人はいますか?

4

5 に答える 5

16

そこには2つのステートメントがあります。「if」ステートメントとベアブロック。ベアブロックは、1回だけ実行されるループです。

say "a";
{
   say "b";
}
say "c";

# Outputs a b c

しかし、ループであるため、、、およびに影響をnext与えlastますredo

my $i = 0;
say "a";
LOOP: {  # Purely descriptive (and thus optional) label.
   ++$i;
   say "b";
   redo if $i == 1;
   say "c";
   last if $i == 2;
   say "d";
}
say "e";

# Outputs a b b c e

(次の要素がないためnextと同じです。)last

これらは通常、字句スコープを作成するために使用されます。

my $file;
{
   local $/;
   open(my $fh, '<', $qfn) or die;
   $file = <$fh>;
}
# At this point,
# - $fh is cleared,
# - $fh is no longer visible,
# - the file handle is closed, and
# - $/ is restored.

ここで使用された理由は不明です。


または、ハッシュコンストラクターにすることもできます。

sub f {
   ...
   if (@errors) {
      { status => 'error', errors => \@errors }
   } else {
      { status => 'ok' }
   }
}

の略です

sub f {
   ...
   if (@errors) {
      return { status => 'error', errors => \@errors };
   } else {
      return { status => 'ok' };
   }
}

Perlは中括弧を覗いて、それがベアループなのかハッシュコンストラクターなのかを推測します。中かっこの内容を提供していないため、わかりません。

于 2012-05-31T15:38:00.727 に答える
11

これは通常、 で使用されるトリックです。 のステートメント修飾子の章doを参照てください。perlsyn

おそらく作者はブロックから飛び出したいなどと思っていたのでしょうnext

于 2012-05-31T14:59:17.737 に答える
4

の場合if、それらはおそらく単一のブレースと同等です (ただし、ブロックの内側と外側にあるものによって異なりますif)。

perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2'

)。nextorとともに二重ブレースを使用する理由があります。 perlsyndoを参照してください。たとえば、これを数回実行してみてください。

perl -E 'if (1) {{ say $c++; redo if int rand 2 }}'

また、二重ブレースを単一ブレースに置き換えてみてください。

于 2012-05-31T14:58:21.520 に答える
0

{{は、「ifブロック」から抜け出すために使用できます。私は以下を含むいくつかのコードを持っています:

if ($entry =~ m{\nuid: ([^\s]+)}) {{ # double brace so "last" will break out of "if"
    my $uid = $1;
    last if exists $special_case{$uid};
    # ....

}}
# last breaks to here
于 2012-06-03T12:57:13.047 に答える
0

多くのコードがなければ、それらが何に使用されているかを言うのは困難です。タイプミスかネイキッド ブロックの可能性があります。章 10.4 The Naked Block Control Structure in Learning Perlを参照してください。

ネイキッド ブロックは、ブロック内の変数にレキシカル スコープを追加します。

于 2012-05-31T14:58:32.543 に答える