Что делает это утверждение: (); - PullRequest
3 голосов
/ 25 августа 2010

Я видел утверждения Perl, которые выглядят так:

() unless $some_var;

Чего это должно достичь?

Ответы [ 6 ]

9 голосов
/ 25 августа 2010

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

3 голосов
/ 25 августа 2010

Тайна разгадана:

GetOptions(
    "-interactive",
    "-request_file=s",
) or usage();

usage unless ($opt_request_file);
() unless ($opt_interactive);

Кажется, '();' вводит в заблуждение - это ничего не делает, и цель состоит в том, чтобы просто упомянуть переменную $ opt_interactive один раз ... как способ подавить предупреждение perl «Имя« $ var »используется только один раз».

Спасибо всем, кто пытался пролить свет!

1 голос
/ 25 августа 2010

Само по себе это выражение не nop. Но значение (пустой список) может автоматически возвращаться из подпрограммы или блока do (), если нет явного оператора return, и это значение оказывается последним в блоке.

1 голос
/ 25 августа 2010

Вероятно, он используется при неявном возврате, если $some_var возвращает значение true, возвращает его, иначе возвращает пустой список.

0 голосов
/ 25 августа 2010

Возвращает пустой список, если $ some_var имеет значение false.

Если я напишу @s = () unless $some_var;, я опустошил @s, если $some_var ложно.

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

0 голосов
/ 25 августа 2010

, если выполняет инструкцию один раз, если и только если условие истинно.

unless является противоположностью, он выполняет инструкцию, если условие не является истинным (то есть, если условие ложно).

см. Подробнее: http://perldoc.perl.org/perlsyn.html

() - это просто пустой список, поэтому этот код предоставляет значение по умолчанию пустого списка для случаев, когда $ some_var имеет значение false (возможно, потому что $ some_var не определено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...