Двойные фигурные скобки в perl

Я смотрел онлайн-код perl и наткнулся на то, что раньше не видел, и не могу узнать, что он делает (если что-нибудь).

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

Кто-нибудь знает, что означают двойные фигурные фигурные скобки?

Ответ 2

Здесь есть два утверждения. Инструкция "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 заглядывает в фигурные скобки, чтобы угадать, является ли он голой петлей или конструктором хэша. Поскольку вы не указали содержимое фигурных скобок, мы не можем сказать.

Ответ 3

В случае if они, вероятно, эквивалентны одиночным скобкам (но это зависит от того, что внутри блока и вне if, cf.

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 }}'

И попробуйте заменить двойные фигурные скобки на отдельные.

Ответ 5

{{может использоваться, чтобы вырваться из "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