我在线查看perl代码并遇到了一些我之前没见过的东西,但却无法知道它在做什么(如果有的话)。
if($var) {{
...
}}
有谁知道双花括号是什么意思?
答案 0 :(得分:15)
那里有两个陈述。 “if”语句和bare block。裸块是只执行一次的循环。
say "a";
{
say "b";
}
say "c";
# Outputs a b c
但是作为循环,它们会影响{{1}},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' }
}
}
Perl偷看大括号,猜测它是裸循环还是哈希构造函数。由于你没有提供大括号的内容,我们无法分辨。
答案 1 :(得分:11)
这是do
通常使用的技巧,请参阅chapter Statement Modifiers in perlsyn
。
可能作者想要用next
之类的东西跳出街区。
答案 2 :(得分:4)
如果是if
,它们可能等同于单个括号(但它取决于块内和if
之外的内容,参见
perl -E ' say for map { if (1) {{ 1,2,3,4 }} } 1 .. 2'
)。但是,使用双括号的原因有next
或do
,请参阅perlsyn。例如,尝试多次运行:
perl -E 'if (1) {{ say $c++; redo if int rand 2 }}'
尝试用单个替换双括号。
答案 3 :(得分:0)
如果没有更多的代码,很难说它们被用于什么。它可能是一个错字,或者它可能是一个裸体块,请参阅chapter 10.4 The Naked Block Control Structure in Learning Perl。
裸块会为块内的变量添加词法范围。
答案 4 :(得分:0)
{{可用于突破“if block”。我有一些代码包含:
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