В чем разница между "||" и "или" в Perl? - PullRequest
33 голосов
/ 16 июля 2009

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

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

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

Ответы [ 4 ]

39 голосов
/ 16 июля 2009

Из Perl Doc.

  • OR

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

Binary "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

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

@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
36 голосов
/ 16 июля 2009

Единственное отличие - их приоритет.

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
32 голосов
/ 17 июля 2009

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

10 голосов
/ 16 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...