今天在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”。
我错过了什么?我已经梳理了几个小时的代码了,我知道我只是忽略了一些小东西。
答案 0 :(得分:15)
使用eq
而不是==
来测试字符串相等性:
if ($A eq "godzilla"){
perldoc perlop提供了更多信息。
注意:将use strict;
和use warnings;
添加到您的脚本顶部会让您朝着正确的方向前进。
答案 1 :(得分:11)
use strict;
和use warnings;
应该在...我的书中即时F。
但是没有...使用“==”对字符串进行评估会评估所有字符串 - 除了那些以'123bob'开头的字符串(请参阅下面的评论) - 作为数字0。这就是它评估为真的原因 - 它正在“变成”陈述0 == 0
。 use 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
。