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

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

Кажется, чтоinternet code использует их обоих:

open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
 jrockway16 июл. 2009 г., 22:28
Или & quot; использовать autodie & quot;
 Telemachus16 июл. 2009 г., 12:31
Увидетьperldoc perlop хороший график приоритетов и см. раздел «Логический или»; для большего количества примеров:perldoc.perl.org/…
 Sinan Ünür16 июл. 2009 г., 12:46
Также используйте лексические дескрипторы файлов и форму open с тремя аргументами. Включите ошибку, возвращенную системой, в аргумент die:open my $file_h, '<', $file or die "Cannot open '$file': $!";

Ответы на вопрос(4)

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
Решение Вопроса

OR

Это оператор списка. В правой части оператора списка он имеет очень низкий приоритет, так что он управляет всеми найденными там выражениями через запятую. Единственными операторами с более низким приоритетом являются логические операторы «и», «или» и «не», которые могут использоваться для оценки вызовов операторов списков без необходимости в дополнительных скобках. Логическое или, Определенное или, и Исключительное Или

Двоичные "или" возвращает логическую дизъюнкцию двух окружающих выражений. Это эквивалентно || за исключением очень низкого приоритета. Это делает его полезным для управления потоком

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

Однако, когда это назначение контекста списка, и вы пытаетесь использовать & quot; || & quot; для потока управления вам, вероятно, понадобится "или" так что назначение имеет более высокий приоритет.

@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
 Steve Schnepp17 июл. 2009 г., 10:00
Принятый ответ, поскольку он более полный, чем у Дэйва Хинтона

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

 22 окт. 2014 г., 09:58
Мне нравится этот ответ больше, чем принятый ответ, гораздо короче и дает вам ответ, который вам нужен.

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

Ваш ответ на вопрос