【问题标题】:Why does "bob" == "godzilla" in Perl?为什么 Perl 中的“bob”==“godzilla”?
【发布时间】:2013-01-24 20:49:16
【问题描述】:

今天在 Perl 课上,一个学生交了一份让我烦恼的作业。我们正在研究 ARGV,但结果不是我所期望的。他的程序 (meme.pl) 是:

#!/usr/bin/perl
$A = $ARGV[0];
chomp($A);
if ($A == "godzilla"){
    print "$A\n";
}
else {
    print "We need a monster's name\n";
}

如果我输入:

% ./meme.pl bob

结果是

% bob

所以变量赋值有效,但无论在命令行上键入什么,条件 ($A == "godzilla") 都是正确的。我预计既然 $ARGV[0] 是“bob”并且 $A=$ARGV[0],那么 $A="godzilla" 就不应该是真的。

我错过了什么?我已经梳理了这段代码几个小时,我知道我只是忽略了一些小事情。

【问题讨论】:

  • 听起来你的班级没有使用 Learning Perl :)
  • 如果我正在教授 Perl 课程,我会拒绝任何不以 use warningsuse strict 开头的作业。

标签: perl argv


【解决方案1】:

使用eq,而不是==,来测试字符串是否相等:

if ($A eq "godzilla"){

更多信息请访问perldoc perlop

注意:use strict;use warnings; 添加到脚本顶部会引导您朝着正确的方向前进。

【讨论】:

    【解决方案2】:

    use strict;use warnings; 应该在我的书中...即时 F。

    但是没有...使用“==”评估所有字符串 - 除了以数字开头的字符串,如 '123bob'(见下面的评论) - 作为数字 0。这就是它评估为真的原因 -它正在“变成”声明0 == 0use warnings; 会告诉你发生了什么事。

    正如许多人所说 - 使用 eq 表示字符串。

    更多证据和选项可以在这里找到:(http://perlmeme.org/howtos/syntax/comparing_values.html)

    相关摘录(示例程序):

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my $string1 = 'three';
    my $string2 = 'five';
    
    if ($string1 == $string2) {
        print "Equal\n";
    } else {
        print "Not equal\n";
    }
    

    从上面的示例中,您会收到警告消息,并且两个字符串的计算结果都为零:

    Argument "five" isn't numeric in numeric eq (==) at ./test.pl line 8.
    Argument "three" isn't numeric in numeric eq (==) at ./test.pl line 8.
    Equal
    

    您没有收到这些警告...只是“平等”,这要归功于您的顶部缺少 use warnings; - errr...您的学生...咳嗽 ... - 代码。 ;)

    【讨论】:

    • 次要更正... 并非所有 字符串评估为数字0。以数字开头的字符串将评估为该数字。例如,'123bob' == 123 为真; '123bob' == 0 是假的。
    • 我还要补充一点,字符串 0 but true 将评估为 true,并且在用作数字时不会引起警告。
    【解决方案3】:

    比较字符串时,必须使用“eq”而不是“==”。所以替换

    ($A == "godzilla")
    

    通过

    ($A eq "godzilla")
    

    【讨论】:

      【解决方案4】:

      其他人所说的关于使用eq 比较字符串是正确的。但是,测试通过了,因为在与== 进行数值比较时,字符串“bob”和字符串“godzilla”都评估为 0,因此测试通过并且您得到bob

      【讨论】:

      • 不以数字开头的字符串的数字始终为零。 ("123abc" → 123, "abc" → 0)
      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多