В чем разница между операторами C-стиля &&
, ||
,... и их читаемой версией Perl "and
", "or
",...?
Кажется, что интернет-код использует их оба:
open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
В чем разница между операторами C-стиля &&
, ||
,... и их читаемой версией Perl "and
", "or
",...?
Кажется, что интернет-код использует их оба:
open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
Из Perl Doc..
Это оператор списка. В правой части оператора списка он имеет очень низкий приоритет, так что он контролирует все найденные там выражения, разделенные запятыми. Единственными операторами с более низким приоритетом являются логические операторы "и", "или" и "нет", которые могут использоваться для оценки вызовов операторов списка без необходимости в дополнительных скобках. Логически или, Определено или, и Эксклюзивно Или
Binary "или" возвращает логическую дизъюнкцию двух окружающих выражений. Это эквивалентно || за исключением очень низкого приоритета. Это делает его полезным для потока управления
print FH $data or die "Can't write to FH: $!";
Это означает, что это короткое замыкание: т.е. правильное выражение оценивается только в том случае, если левое выражение ложно. Из-за своего приоритета вам, вероятно, следует избегать использования этого для назначения, только для потока управления.
$a = $b or $c; # bug: this is wrong
($a = $b) or $c; # really means this
$a = $b || $c; # better written this way
Однако, когда это назначение списка-контекста, и вы пытаетесь использовать "||", для потока управления вам, вероятно, потребуется "или" , чтобы присвоение занимало более высокий приоритет.
@info = stat($file) || die; # oops, scalar sense of stat!
@info = stat($file) or die; # better, now @info gets its due
Затем вы всегда можете использовать круглые скобки.
Если какой-либо оператор списка (print() и т.д.) или любой унарный оператор (chdir() и т.д.) сопровождается левой скобкой в качестве следующего токена, оператор и аргументы в круглых скобках считаются наивысшими приоритет, как и обычный вызов функции. Например, поскольку именованные унарные операторы имеют более высокий приоритет, чем ||:
chdir $foo || die; # (chdir $foo) || die
chdir($foo) || die; # (chdir $foo) || die
chdir ($foo) || die; # (chdir $foo) || die
chdir +($foo) || die; # (chdir $foo) || die
Единственное отличие заключается в их приоритете.
open FILE, $file or die("cannot open $file"); # this works
open FILE, $file || die("cannot open $file"); # this doesn't work
open FILE, ($file || die("cannot open $file")); # why it doesn't work
!
, &&
, ||
и ^
имеют высокий приоритет, так что они полезны при построении выражения; not
, and
, or
и xor
имеют низкий приоритет, так что они полезны для управления потоком между существенно отличающимися выражениями.
"& &" и "||" операторы имеют более высокий приоритет, чем их "и", "или" аналоги ".