Я смотрел онлайн-код perl и наткнулся на то, что раньше не видел, и не могу узнать, что он делает (если что-нибудь).
if($var) {{
...
}}
Кто-нибудь знает, что означают двойные фигурные фигурные скобки?
Я смотрел онлайн-код perl и наткнулся на то, что раньше не видел, и не могу узнать, что он делает (если что-нибудь).
if($var) {{
...
}}
Кто-нибудь знает, что означают двойные фигурные фигурные скобки?
Это трюк, обычно используемый с do
, см. глава Модификаторы отчётов в perlsyn
.
Вероятно, автор хотел выскочить из блока с помощью next
или тому подобного.
Здесь есть два утверждения. Инструкция "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
, 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 }}'
И попробуйте заменить двойные фигурные скобки на отдельные.
Без большого количества кода трудно сказать, для чего они используются. Это может быть опечатка, или это может быть голый блок, см. глава 10.4. Структура управления обнаженным блоком в Обучение Perl.
Голый блок добавляет лексическое охват к переменным внутри блока.
{{может использоваться, чтобы вырваться из "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