我在网上查看 perl 代码,遇到了一些我以前没见过的东西,也找不到它在做什么(如果有的话)。
if($var) {{
...
}}
有谁知道双花括号是什么意思?
我在网上查看 perl 代码,遇到了一些我以前没见过的东西,也找不到它在做什么(如果有的话)。
if($var) {{
...
}}
有谁知道双花括号是什么意思?
那里有两种说法。一个“if”语句和一个裸块。裸块是只执行一次的循环。
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 窥视大括号以猜测它是裸循环还是散列构造函数。由于您没有提供大括号的内容,我们无法判断。
在 的情况下if
,它们可能等同于单括号(但这取决于块内部和外部的内容if
,参见。
perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2'
)。不过,使用双括号是有理由的,使用next
or do
,请参阅perlsyn。例如,尝试运行几次:
perl -E 'if (1) {{ say $c++; redo if int rand 2 }}'
并尝试用单括号替换双括号。
如果没有更多代码,很难说出它们的用途。它可能是一个错字,也可能是一个裸块,请参阅第 10.4 章学习 Perl中的裸块控制结构。
裸块将词法范围添加到块中的变量。
{{ 可用于突破“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