Ну, они все делают разные вещи.
Однако при прочих равных условиях
push @list, 'foo' if $foo;
- это утверждение, которое наиболее точно передает его значение, поэтому оно должно быть предпочтительным.
Если вам нужно остановиться и подумать об утверждении, которое предположительно делает что-то такое же простое, как нажатие на элемент массива, вы делаете что-то не так.
my @list = (
$foo ? 'foo' : (),
$bar ? 'bar' : (),
);
может быть в порядке, если это часть колоссальной инициализации, которая выполняется в другом месте.
Я думаю, используя
my @list = (
('foo') x!! $foo,
('bar') x!! $bar,
);
указывает, что у программиста есть & mdash; как мне это выразить? & mdash; вопросы .
Между прочим, не существует такого понятия, как x!!
составной оператор. !!
- это двойное логическое отрицание . Он преобразует произвольное ложное значение в определенное, но ложное значение (пустую строку), которое дает 0
при использовании, где perl
ожидает число. Истинное значение преобразуется в 1
. Здесь !!
работает с $foo
и $bar
, и запись его x!! $foo
излишне запутывает смысл кода.
x
является оператором повторения . Таким образом,
('foo') x !!$foo;
означает повторить ('foo')
один раз или не сделать это вообще, в зависимости от того, истинно ли $foo
или ложно, соответственно .
PS: Конечно, оказывается, в статье PerlMonks вводится так называемый оператор сквоша логического списка . Я прочитал статью и нашел ее неубедительной.