如何强制逻辑或运算符的列表上下文



我有一个脚本,允许用户通过命令行参数或stdin输入,所以我做到了:

my @expr = @ARGV || <STDIN>;

这并没有如预期的那样奏效。我只得到一些数字,比如1。我不得不使用以下版本:

my @expr = @ARGV;
if (!@expr) {
  @expr = <STDIN>;
}

为什么会发生这种情况?如何使第一个版本工作(如果可能的话)?

||运算符在标量上下文中需要其LHS。同一个表达式不能同时是列表表达式和标量表达式。

最简洁的方法是使用? :三元运算符:

my @expr = @ARGV ? @ARGV : <STDIN>;

这样,@ARGV的第一次出现是标量的,因此测试是否为非空,但第二次出现在列表上下文中,因此产生实际项。

最新更新