3

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

4 回答 4

15

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

if ($A eq "godzilla"){

更多信息可在perldoc perlop 获得

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

于 2013-01-24T20:52:11.210 回答
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

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

于 2013-01-24T20:55:22.257 回答
6

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

($A == "godzilla")

经过

($A eq "godzilla")
于 2013-01-24T20:53:36.673 回答
5

其他人所说的关于使用eq比较字符串是正确的。但是,测试通过了,因为当与==字符串 'bob' 和字符串 'godzilla' 进行数字比较时,结果都为 0,所以测试通过并且你得到bob.

于 2013-01-24T20:59:10.880 回答