オンラインで perl コードを調べていたところ、見たことのないものに出会い、それが何をしているのか (もしあれば) わかりませんでした。
if($var) {{
...
}}
二重中括弧の意味を知っている人はいますか?
オンラインで perl コードを調べていたところ、見たことのないものに出会い、それが何をしているのか (もしあれば) わかりませんでした。
if($var) {{
...
}}
二重中括弧の意味を知っている人はいますか?
そこには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は中括弧を覗いて、それがベアループなのかハッシュコンストラクターなのかを推測します。中かっこの内容を提供していないため、わかりません。
これは通常、 で使用されるトリックです。 のステートメント修飾子の章do
を参照してください。perlsyn
おそらく作者はブロックから飛び出したいなどと思っていたのでしょうnext
。
の場合if
、それらはおそらく単一のブレースと同等です (ただし、ブロックの内側と外側にあるものによって異なりますif
)。
perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2'
)。next
orとともに二重ブレースを使用する理由があります。 perlsyndo
を参照してください。たとえば、これを数回実行してみてください。
perl -E 'if (1) {{ say $c++; redo if int rand 2 }}'
また、二重ブレースを単一ブレースに置き換えてみてください。
{{は、「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
多くのコードがなければ、それらが何に使用されているかを言うのは困難です。タイプミスかネイキッド ブロックの可能性があります。章 10.4 The Naked Block Control Structure in Learning Perlを参照してください。
ネイキッド ブロックは、ブロック内の変数にレキシカル スコープを追加します。