Каков результат Perl's &&? - PullRequest
5 голосов
/ 24 октября 2010

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

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

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

Ответы [ 3 ]

15 голосов
/ 24 октября 2010

Цитата perlop :

Операторы "||", "//" и "&&" вернуть последнее оцененное значение (в отличие от 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…), так как в любом случае все выражение верно. И если проверка файла не пройдена во второй строке, вам не нужно снова оценивать правую сторону, так как общий результат неверен. Если бы логические операторы настаивали на оценке всего выражения в любом случае, мы не могли бы использовать их таким образом.

11 голосов
/ 24 октября 2010

Вот как работает оператор &&: если левый аргумент оценивается как истина, значение выражения равно значению правого аргумента. Это описано на странице 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.
2 голосов
/ 24 октября 2010

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

...