为什么Perl中的“bob”==“godzilla”?

时间:2013-01-24 20:49:16

标签: perl argv

今天在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”。

我错过了什么?我已经梳理了几个小时的代码了,我知道我只是忽略了一些小东西。

4 个答案:

答案 0 :(得分:15)

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

if ($A eq "godzilla"){

perldoc perlop提供了更多信息。

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

答案 1 :(得分:11)

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; ......你的学生...... 咳嗽 ... - 代码。 ;)

答案 2 :(得分:6)

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

($A == "godzilla")

通过

($A eq "godzilla")

答案 3 :(得分:5)

其他人说使用eq来比较字符串是正确的。但是,测试通过了,因为在数字上与==进行比较时,字符串'bob'和字符串'godzilla'都会计算为0,因此测试通过并得到bob