Perl == / eq查找值或类型?

时间:2013-11-22 15:26:45

标签: perl

 65 sub is_in_array {
 66     my ($item, $arr) = @_;
 67     print $item . "\n";
 68     foreach(@$arr) {
 69         print $_ . "\n";
 70         if ($_ == $item) {
 71             return 1;
 72         }
 73     }
 74     #if (grep {$_ == $item} @$arr) {
 75     #    return 1;
 76     #}
 77     return 0;
 78 }
在@ $ arr中

它有

1de990354c913358c7d471b3dd6f1c6d  
c55e479d1a9befb605a84d0784afb277  
我试过的

$ item:

1de990354c913358c7d471b3dd6f1c6d  
c55e479d1a9befb605a84d0784afb277  
fb145f34ad73cb48a47ecdc4ccff52d9  
4766b07e6677ebadde51f6b281076283  

他们都返回1但是他们应该返回0以获得最后两个

谁知道为什么他们都回来了?


它返回0(当我将其更改为eq而不是==时)

7a90d765785b87238c3c33d9ec28fa44  
65153ae422d82c745656e7bca92edf20  

我很困惑

5 个答案:

答案 0 :(得分:3)

==是一个数字等于运算符。当你在非数字的东西上使用它时,它会从前导数字中获得一个数字,如果没有则使用0。使用eq代替字符串等号。

请注意,当==使用不仅仅是数字的内容时,它会发出警告;你应该总是启用警告来帮助你找到这样的问题。

答案 1 :(得分:3)

如果您添加了use strictuse warnings,则可以通过查看错误消息找到自己的信息:

Argument "1de990354c913358c7d471b3dd6f1c6d" isn't numeric in numeric eq (==) at stack.pl line 31.

因此,请将==替换为eq

#!/usr/bin/perl
use warnings;
use strict; 

my @array = ('1de990354c913358c7d471b3dd6f1c6d', 'c55e479d1a9befb605a84d0784afb277');
my $item = '1de990354c913358c7d471b3dd6f1c6d';
foreach(@array) {
    if ($_ eq $item) {
        print "Match found : $_\n";
    }
}

输出:

Match found : 1de990354c913358c7d471b3dd6f1c6d

答案 2 :(得分:3)

两个运算符都比较值,而不是类型。但是==会对数字进行比较,而eq会按字符串进行比较,默认情况下都会尝试将您的值转换为他们比较的类型。

答案 3 :(得分:1)

在比较字符串时,您必须使用eq

70         if ($_ eq $item) {
71             return 1;
72         }

答案 4 :(得分:1)

我已经运行了你的代码:

my @arr = qw/1de990354c913358c7d471b3dd6f1c6d c55e479d1a9befb605a84d0784afb277/;
sub is_in_array {
    my ($item, $arr) = @_;
#   print $item . "\n";

    foreach(@$arr) {
#       print $_ . "\n";
        if ($_ eq $item) { # use eq instead of ==
            return 1;
        }
     }
     return 0;
}

我从你的例子中得到了两个项目:

  

1de990354c913358c7d471b3dd6f1c6d
  c55e479d1a9befb605a84d0784afb277
  fb145f34ad73cb48a47ecdc4ccff52d9
  4766b07e6677ebadde51f6b281076283

这很好用:

print 'First'  if is_in_array('1de990354c913358c7d471b3dd6f1c6d', \@arr);
# Second won't be printed
print 'Second' if is_in_array('fb145f34ad73cb48a47ecdc4ccff52d9', \@arr);

您得到此结果they all return 1 but they should return 0 for the bottom two因此您应该仔细检查您的$ item值