2

所以我首先要说我对 Perl 不是很熟悉。我有一个项目,我在工作中被交给了需要相当多的 Perl 工作。其中大部分是有道理的,但我被困在一个非常简单的问题上。

出于示例目的,我已经简化了我的代码。如果我能让它工作,我可以对项目的其余部分进行编码,但由于某种原因,我似乎无法获得像以下这样简单的东西来为我工作:

#!/usr/local/bin/perl
@names = ('Harry','Larry','Moe');
foreach $name (@names){
    if($name == 'Harry'){
        print $name;
    }
}

任何帮助是极大的赞赏!

编辑:仅供参考以上的输出如下:

HarryLarryMoe
4

2 回答 2

11

Perl 中的字符串比较不是用,==而是用eq. Perl 不会考虑与13字符串不同的整数,'13'直到您对它们进行操作。不以任何明显方式(例如'Harry')表示数字的字符串值被强制为数值零。因此,$name=='Harry'将永远持有,但$name eq 'Harry'不会。

查看perldoc perlop更多信息。

编辑添加: 如果您启用了warnings编译指示,那么解释器会向您指出这一点。事实上,在您编写的几乎所有 Perl 代码中,它总是一个主意。特别是,这段代码(通过命令行作为单行代码执行):use strictuse warningsperl -e

use strict;
use warnings;
my @names=("Harry","Larry","Moe");

foreach my $name(@names)
{
  if($name=="Harry")
  {
    print "$name\n";
  }
}

产生输出

Argument "Harry" isn't numeric in numeric eq (==) at -e line 7.
Argument "Harry" isn't numeric in numeric eq (==) at -e line 7.
Harry
Argument "Larry" isn't numeric in numeric eq (==) at -e line 7.
Larry
Argument "Moe" isn't numeric in numeric eq (==) at -e line 7.
Moe
于 2012-04-11T20:53:44.977 回答
1

之所以这样,是因为您使用数值比较,但应该使用字符串一 ( eq)。$name并将Harry两者都评估为 0,因此您的示例中的比较总是正确的。

于 2012-04-11T20:56:57.300 回答