【问题标题】:problem passing 0 as command-line argument将 0 作为命令行参数传递的问题
【发布时间】:2011-03-31 13:20:38
【问题描述】:

当我将 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  

如果有人能阐明这一点,我将不胜感激。谢谢。 ww

【问题讨论】:

    标签: perl command-line-arguments


    【解决方案1】:

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

    my $x = shift // 1;  
    

    来自 perldoc perlop:

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

    注意:defined-or 运算符从 5.10(2007 年 12 月 18 日发布)开始可用

    【讨论】:

    • 我感觉这是在相当新的 Perl 版本中引入的,你能说一下是哪一个吗?然后我会 +1。
    • @gbacon:谢谢。由于我们中的很多人仍在使用早期版本,您能否在回答中提及这一点,请 eugene y?谢谢。
    • 感谢所有回答的人。没想到这么快就得到了答复。谢谢,尤金,我猜你是第一个回答的人。
    【解决方案2】:

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

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

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

    my $x = @ARGV ? shift : 1;
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,但正如 gbacon 在其他地方的评论中提到的那样,这确实需要 Perl 5.10 或更高版本。
      • j_random_hacker:Wayne 使用的是 5.10.0,已经 2.5 年了。
      【解决方案4】:

      在这一行my $x = shift || 1; 中,移位未通过测试,因此条件逻辑 OR || 被执行并为其分配了 1...根据shift 上的页面,值为 0,这意味着空数组。 ...

      【讨论】:

        【解决方案5】:

        表达式shift || 1 选择右轴当且仅当左轴计算结果为“假”。由于您传递的是 0,其计算结果为“false”,$x 最终的值为 1。

        【讨论】:

          猜你喜欢
          • 2013-07-15
          • 1970-01-01
          • 2015-04-11
          • 2016-02-07
          • 2016-10-10
          • 1970-01-01
          • 2023-02-10
          • 2012-03-25
          • 2017-12-17
          相关资源
          最近更新 更多