11

我在网上查看 perl 代码,遇到了一些我以前没见过的东西,也找不到它在做什么(如果有的话)。

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

有谁知道双花括号是什么意思?

4

5 回答 5

16

那里有两种说法。一个“if”语句和一个裸块。裸块是只执行一次的循环。

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

# Outputs a b c

但作为循环,它们确实会影响next和。lastredo

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 do,请参阅perlsyn。例如,尝试运行几次:

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

并尝试用单括号替换双括号。

于 2012-05-31T14:58:21.520 回答
0

如果没有更多代码,很难说出它们的用途。它可能是一个错字,也可能是一个裸块,请参阅第 10.4 章学习 Perl的裸块控制结构

裸块将词法范围添加到块中的变量。

于 2012-05-31T14:58:32.543 回答
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 回答