2012-04-11 53 views
2

所以我会开始说我对Perl不是很熟悉。我有一个项目需要完成一些Perl工作。它大部分是有道理的,但我坚持一个非常简单的问题。Perl:在数组中使用条件

为了示例目的,我简化了代码。如果我能得到这个工作,我可以编写该项目的其余部分没有问题,但由于某种原因,我似乎无法得到那么简单,以下为我工作的东西:

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

任何帮助不胜感激!

编辑:上述FYI输出为以下内容:在Perl

HarryLarryMoe 

回答

11

字符串比较不与==eq完成。在对它们进行操作之前,Perl并不考虑整数13与字符串'13'不同。 String values that don't represent numbers in any obvious way (e.g. 'Harry') are coerced to a numeric value of zero。因此,$name=='Harry'将始终成立,但$name eq 'Harry'不会。

查看perldoc perlop了解更多信息。

编辑补充:如果您已使warnings编译,然后解释会指出这一点给你。事实上,它是总是一个不错的主意到use strictuse warnings几乎所有你写的Perl代码。

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 
+1

优秀的解释。非常感谢!并感谢关于严格和警告的提示。将会挑衅地添加并开始使用。 – 2012-04-11 21:07:44

+0

@JoeBrrton - 你非常欢迎。我也建议你把手放在[学习Perl](http://www.amazon.com/Learning-Perl-Randal-L-Schwartz/dp/1449303587),[编程Perl](http:///www.amazon.com/Programming-Perl-Unmatched-processing-scripting/dp/0596004923/ref=sr_1_1?s=books&ie=UTF8&qid=1334179061&sr=1-1)和/或[Modern Perl](http:// onyxneon .com/books/modern_perl /)(后者是免费的)。 – 2012-04-11 21:18:37

+0

“挑衅”?叹。 – AmbroseChapel 2012-04-14 10:52:14

1

正是这种方式,因为使用的数值的比较,但应使用字符串:特别地,该代码(如通过命令行经由perl -e一行程序执行)一个(eq)。 $nameHarry都评价为0,所以你的比较在你的例子中总是如此。