Здесь происходит несколько вещей, но наиболее важным является тот факт, что такого рода строки обычно появляются в качестве последней строки исполняемого блока [1].В этом контексте значение блока является значением последнего выполненного оператора [2].Теперь оператор, содержащий unless
, имеет значение с левой стороны, если правая часть истинна, и значение с правой стороны в противном случае, так что это способ сказать, что «значение блока равно $some_var
если $some_var
истинно, ()
в противном случае ".
()
- это просто пустой список, поэтому этот код предоставляет значение по умолчанию пустого списка для случаев, когда $some_var
является ложным (вероятно, потому что $some_var
не определено.)
Более обычно достичь того же эффекта с or
, что и в эквивалентном
$some_var or ();
Вместе мы можемпосмотрите эти случаи:
use strict;
use warnings;
my @x = do { () unless 0 };
my @y = do { () unless 5 };
print "\@x: <@x>\n\@y: <@y>\n";
@x
- пустой массив, потому что 0
- ложь, тогда как @y
- массив, содержащий 5
, потому что 5
- истина.
В любом другом месте, кроме как в качестве последнего оператора блока, () unless $some_var;
является запретом.Тем не менее, оно подавляет предупреждение once
, если $some_var
не упомянуто иным образом.
[1]: Это блок, оцененный как eval
или do
или предоставленный (например) map
или grep
, или блок, вызываемый как подпрограмма.
[2]: «Значение последнего выполненного оператора» - странная фраза;в основном только выражения имеют значения.Но поскольку в Perl есть концепция, что при отсутствии явного возврата значением блока является значение последнего оператора, Perl нужна эта странная фраза.