Из раздела о контексте в perldoc perldata
:
Назначение немного особенного в том, что он использует свой левый аргумент для определения контекста для правильного аргумента. Присвоение скаляру оценивает правую часть в скалярном контексте, тогда как присвоение массиву или хешу оценивает правую сторону в контексте списка. Присвоение списку (или срезу, который является только списком) также оценивает правую часть в контексте списка.
(курсив)
И от perldoc perlop
:
условного оператора
[...]
Скалярные или контекст списка распространяется вниз в 2 или 3-й аргумент, в зависимости от того, что выбрано.
$a = $ok ? $b : $c; # get a scalar
@a = $ok ? @b : @c; # get an array
$a = $ok ? @b : @c; # oops, that's just a count!
Что касается старшинства, ||
имеет более высокий приоритет, чем условный оператор, так
my $result = $foo || $bar ? 0 : 1;
эквивалентно
my $result = ($foo || $bar) ? 0 : 1;
Обратите внимание, что круглые скобки не создают контекст списка , что является распространенным заблуждением. В этом случае они не нужны, но они улучшают читаемость, поэтому я бы рекомендовал их использовать.
Опять же, в
my $result = $foo || ($bar ? 0 : 1);
круглые скобки не создают контекст списка. С ||
Скаляр или контекст списка распространяется до правого операнда, если он оценивается.
так ($bar ? 0 : 1)
оценивается в скалярном контексте (при условии $foo
является истинным значением, а если нет, ||
короткого замыкания и РИТ не вычисляется вовсе).
Просто из любопытства, чего именно вы пытаетесь достичь? Связано ли это с вашим предыдущим вопросом об использовании '@ ARGV' или' STDIN'? Более конкретный пример был бы приятным. В общем, я бы использовал только условный оператор для очень простых случаев, так как немного умнее анализировать, чем простой 'if' /' else'. – ThisSuitIsBlackNot
@thissuitisblacknot хорошо, что они не совсем связаны, но это проблемы, которые у меня были в одном проекте.если иначе всегда есть универсальное решение, но я просто хочу знать некоторые грязные хаки perl – texasbruce