为什么Perl中的"bob"=="godzilla"?

use*_*900 3 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";
}
Run Code Online (Sandbox Code Playgroud)

如果我输入:

% ./meme.pl bob
Run Code Online (Sandbox Code Playgroud)

结果是

% bob
Run Code Online (Sandbox Code Playgroud)

因此变量赋值有效,但无论在命令行输入什么,条件($ A =="godzilla")都是真的.我预计,因为$ ARGV [0]是"bob"而$ A = $ ARGV [0],那么它不应该是$ A ="godzilla".

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

gpo*_*ojd 15

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

if ($A eq "godzilla"){
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问perldoc perlop.

注意:添加use strict;use warnings;你的脚本的顶部会导致你在正确的方向.


Pin*_*ade 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";
}
Run Code Online (Sandbox Code Playgroud)

从上面的示例中,您将收到警告消息,并且两个字符串将评估为零:

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
Run Code Online (Sandbox Code Playgroud)

你没有得到那些警告......只是"平等",这要归功于use warnings;你的错误......你的学生...... 咳嗽 ......代码.;)

  • 我还要补充一点,字符串'0但是true`将评估为true,并且在用作数字时不会引发警告. (2认同)

Mig*_*Prz 6

在比较字符串时,必须使用"eq"而不是"==".所以更换

($A == "godzilla")
Run Code Online (Sandbox Code Playgroud)

通过

($A eq "godzilla")
Run Code Online (Sandbox Code Playgroud)


Cra*_*tow 5

其他人所说的eq用于比较字符串是正确的.然而,测试通过,因为当数字与==字符串'bob'进行比较时,字符串'godzilla'都评估为0,所以测试通过然后你得到bob.