将0作为命令行参数传递的问题

时间:2010-08-18 13:09:18

标签: perl command-line-arguments

当我将0作为命令行参数传递给脚本时,我注意到了perl5(5.10.0)的奇怪行为,该脚本将其赋值给变量。我遇到的问题是,如果我在我的脚本中给变量一个大于0的默认值,比如1,那么我可以传递除0之外的任何值来覆盖默认值1.

以下是我使用的'test.pl'的代码:

#!/usr/bin/perl -w  
my $x = shift || 1;  
print "x is $x\n";  

以下是测试时的命令和输出:

$ ./test.pl 2  
x is 2  
$ ./test.pl 0  
x is 1  

如果有人能说清楚这一点,我会很感激。谢谢。 wwl

5 个答案:

答案 0 :(得分:15)

如果您希望$x在没有提供参数的情况下具有值“1”,请使用:

my $x = shift // 1;  

来自perldoc perlop:

  

“//”与“||”完全相同,          除了它测试左手边的定义而不是它          真相。

注意:定义的或运算符从5.10开始(2007年12月18日发布)

答案 1 :(得分:7)

表达式shift || 1选择rhs iff lhs评估为“false”。由于您传递0(评估为“false”),$x最终得到值1.

答案 2 :(得分:6)

最好的方法是在eugene和Alexandr的答案中,但如果你坚持使用旧的perl,请使用

my $x = shift;
$x = 1 unless defined $x;

因为您有一个可选参数,所以可以在标量上下文中检查@ARGV以检查存在多少个命令行参数。如果它在那里,使用它,或以其他方式回到默认值:

my $x = @ARGV ? shift : 1;

答案 3 :(得分:3)

使用defined-或operator,因为字符串“0”已定义,但未评估为true。

#!/usr/bin/perl -w  
my $x = shift // 1;  
print "x is $x\n";  

答案 4 :(得分:0)

在此行[{1}}中,班次未通过测试,因此条件逻辑OR my $x = shift || 1;已执行并为其分配1 ...根据shift上的页面,值为0表示空数组......