可能的方法:
>使用push:
my @list; push @list,'foo' if $foo; push @list,'bar' if $bar;
my @list = ( $foo ? 'foo' : (),$bar ? 'bar' : (),);
>使用x!!
Boolean list squash operator:
my @list = ( ('foo') x!! $foo,('bar') x!! $bar,);
哪一个更好,为什么?
解决方法
嗯,他们都做不同的事情.
但是,所有其他因素都相同,
push @list,'foo' if $foo;
是最直接传达其含义的陈述,因此应该是首选.
如果你必须暂停并思考那些应该像推送数组元素一样简单的语句,那么你做错了什么.
my @list = ( $foo ? 'foo' : (),);
如果这是其他地方正在进行的一些巨大初始化的一部分,那就可以了.
我觉得用
my @list = ( ('foo') x!! $foo,);
表示程序员有 – 我可以把它? – issues.
顺便说一句,没有这样的东西叫x !!复合运算符. !!它将一个任意的false值转换为一个已定义但值为false的值(空字符串),当perl需要一个数字时,它会产生0.真值转换为1.这里,!!在$foo和$bar上运行并编写x !! $foo不必要地混淆了代码的含义.
x是repetition operator.所以,
('foo') x !!$foo;
意味着重复(‘foo’)一次或根本不重复,具体取决于$foo是真还是假.
PS:当然,事实证明有一个PerlMonks article引入了所谓的布尔列表压缩运算符.我读了article并发现它不能令人信服.