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
我很困惑
答案 0 :(得分:3)
==
是一个数字等于运算符。当你在非数字的东西上使用它时,它会从前导数字中获得一个数字,如果没有则使用0。使用eq
代替字符串等号。
请注意,当==
使用不仅仅是数字的内容时,它会发出警告;你应该总是启用警告来帮助你找到这样的问题。
答案 1 :(得分:3)
如果您添加了use strict
和use 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值