Каков результат работы Perl's &&?
Когда я пытаюсь это сделать:
$a = 1;
$b = 2;
print ($a && $b) . "n";
Результат равен 2. Почему?
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 .До тех пор, пока вы не поймете их достаточно, чтобы решить для себя, продолжать ли с ними. :- )#!/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.