Каков результат работы Perl's &&?


Когда я пытаюсь это сделать:

$a = 1;
$b = 2;
print ($a && $b) . "n";

Результат равен 2. Почему?

3 5

3 ответа:

Цитата перлоп :

Операторы"||", "/ / "и"&&" возвращает последнее вычисленное значение (в отличие от C "| | "и"&&", которые возврат 0 или 1).

Полученный результат 2 считается истинным Perl, так что при использовании оператора && в логическом условии все работает так, как ожидалось. Дополнительный бонус заключается в том, что вы можете использовать логические операторы и в других контекстах:

sub say_something {
    say shift || 'default';
}

say_something('foo'); # prints 'foo'
say_something(); # prints 'default'

Или даже как модификаторы потока:

my $param = shift || die "Need param!";
-f $file && say "File exists.";

В последнем два примера хорошо бы понять, что они не могли бы работать, если бы операторы && и || не делали короткого замыкания. Если Вы shift истинное значение в первой строке, нет смысла оценивать правую сторону (die…), так как все выражение истинно в любом случае. И если тест файла не выполняется на второй строке, вам не нужно снова оценивать правую сторону, так как общий результат будет ложным. Если бы логические операторы настаивали на вычислении всего выражения в любом случае, мы не могли бы их использовать именно такой образ.

Вот как работает оператор &&: если левый аргумент принимает значение true, то значение выражения равно значению правого аргумента. Это описано на страницеperlop .

Тем не менее, вы также позволили себе открыть для себя гораздо более тонкую проблему. Вы обнаружите, что новая строка не печатается. Это происходит потому, что если вы заключаете выражение в квадратные скобки после print (или любого другого имени функции), аргументы, передаваемые в print, являются только теми, которые заключены в квадратные скобки. Чтобы получить уведомление об этом, убедитесь, что вы включили предупреждения. Поместите эти строки в начало каждой программы:
#!/usr/bin/perl -w

use strict;
До тех пор, пока вы не поймете их достаточно, чтобы решить для себя, продолжать ли с ними. :- )

В вашем случае вы получите следующее:

print (...) interpreted as function at p line 7.
Useless use of concatenation (.) or string in void context at p line 7.

Потому что оператор && вычисляет правый операнд и возвращает результат, когда левый операнд принимает значение true.