如果没有给出命令行参数,以下似乎可以正常工作,但是当它们全部得到时,我得到的是提供的参数数量,而不是参数本身。@ARGV
似乎是由||
强制标量的。我还尝试使用or
和//
取得相似的结果。这里使用的正确操作员是什么?
say for @ARGV || qw/one two three/;
||
操作员通过其所做的性质强加了标量上下文
二进制
"or"
返回逻辑两个周围表达式的脱节。除了非常低的优先级外,它等效于||
。
(强调我的)。因此,当它的左侧操作数是一个数组时,它会得到数组的长度。
但是,如果是 0
,则右手只是评估
这意味着它短路:仅当左表达式为false时才能评估正确的表达式。
C风格逻辑或Perlop中的内容
标量或列表上下文如果对其进行评估,则会传播到正确的操作数。
因此,您在这种情况下获取列表。
没有操作员可以执行您的声明所需的内容。最接近的可能是
say for (@ARGV ? @ARGV : qw(one two));
但是有更好,更多的系统性方法可以处理@ARGV
。
只需将其写成两行。
@ARGV = qw[...] unless @ARGV;
say for @ARGV;