2010-08-18 68 views
9

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

以下是“test.pl”我用:

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

以下是命令,当我测试了它。OUPUTS:

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

我会很感激,如果任何人都可以在这个线索。谢谢。 wwl

回答

15

如果你想$x有“1”的情况下,不提供参数值结束了,用这个:

my $x = shift // 1; 

从的perldoc perlop中:

“//” 是完全一样的 “||”, 只是它测试左侧的definedness而不是它 真理。

注:定义-或操作员可从5.10开始(12月18日公布,2007年)

+2

不要忘了'使用5.10.0;' – 2010-08-18 13:17:50

+0

我这是在一个相当最新版本的Perl引入的感觉,你可以说哪一个?然后我会+1。 – 2010-08-18 13:17:53

+0

@gbacon:谢谢。由于我们中有相当一部分人仍在使用早期版本,您能否在您的回答中提及此问题,请eugene y?谢谢。 – 2010-08-18 13:19:07

7

如果lhs评估为“假”,则表达式shift || 1选择rhs。既然你是路过0,计算结果为“假”,$x与值1

0

在该线my $x = shift || 1;移位测试失败,因此,条件逻辑OR ||被执行,并分配1 ...根据shift上的页面,值为0,这意味着空阵列...

3

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

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

是的,但正如gbacon在其他地方的评论中提到的,这确实需要Perl 5.10或更高版本。 – 2010-08-18 13:20:01

+2

j_random_hacker:Wayne使用5.10.0,这是2.5岁。 – 2010-08-19 20:01:29

+0

好点Alexandr! :) – 2010-08-20 14:54:19

6

,最好的方法是一个在尤金和亚历山大的答案,但如果你坚持使用旧的Perl,使用

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

因为你有一个可选参数,你可以检查@ARGV在标量上下文中检查有多少个命令行参数。如果它的存在,使用它,否则依傍默认:

my $x = @ARGV ? shift : 1;