我有一个脚本,允许用户通过命令行参数或stdin输入,所以我做到了:
my @expr = @ARGV || <STDIN>;
这并没有如预期的那样奏效。我只得到一些数字,比如1。我不得不使用以下版本:
my @expr = @ARGV;
if (!@expr) {
@expr = <STDIN>;
}
为什么会发生这种情况?如何使第一个版本工作(如果可能的话)?
||
运算符在标量上下文中需要其LHS。同一个表达式不能同时是列表表达式和标量表达式。
最简洁的方法是使用? :
三元运算符:
my @expr = @ARGV ? @ARGV : <STDIN>;
这样,@ARGV
的第一次出现是标量的,因此测试是否为非空,但第二次出现在列表上下文中,因此产生实际项。