Подтвердить что ты не робот

В чем разница между "||" и "или" в Perl?

В чем разница между операторами C-стиля &&, ||,... и их читаемой версией Perl "and", "or",...?

Кажется, что интернет-код использует их оба:

open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
4b9b3361

Ответ 1

Из 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

Ответ 2

Единственное отличие заключается в их приоритете.

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

Ответ 3

!, &&, || и ^ имеют высокий приоритет, так что они полезны при построении выражения; not, and, or и xor имеют низкий приоритет, так что они полезны для управления потоком между существенно отличающимися выражениями.

Ответ 4

"& &" и "||" операторы имеют более высокий приоритет, чем их "и", "или" аналоги ".