我仍然感觉我的方式虽然perl所以可能有一个简单的方法,但我可以找到它。我想将单个值A
或E
与可能包含或不包含该值的数组进行比较,例如A B C D
,然后在匹配时执行操作。我该如何设置?
感谢。
答案 0 :(得分:2)
您过滤数组的每个元素以查看它是否是您要查找的元素,然后将结果数组用作布尔值(不是empty = true,empty = false):
@filtered_array = grep { $_ eq 'A' } @array;
if (@filtered_array) {
print "found it!\n";
}
答案 1 :(得分:1)
如果您将列表存储在数组中,那么唯一的方法是使用grep
或for
或any
grep
来循环检查每个元素。 (SQLite
是最糟糕的,因为它搜索整个数组,即使早期找到了匹配项。)如果数组很小,这很好,但是你会遇到性能问题如果阵列的大小很大,你必须经常检查它。
当对成员身份的检查只是单个键查找时,您可以通过在哈希中表示相同的列表来加快速度。
或者,如果列表很大,那么最好使用{{1}}将其保存在数据库中。
答案 2 :(得分:1)
你被困在阵列上吗?
每当在Perl中谈论快速查找数据时,您应该考虑哈希。哈希是数组的集合,但它是键入的,在Perl中查找键是一个非常快速的操作。
没有任何内容表示哈希的键不能成为您的数据,并且在Perl中通常使用哈希索引数组以便快速搜索值。
这会将您的数组@array
转换为名为%arrays_hash
的哈希。
use strict;
use warnings;
use feature qw(say);
use autodie;
my @array = qw(Alpha Beta Delta Gamma Ohm);
my %array_index;
for my $entry ( @array ) {
$array_index{$entry} = 1; # Doesn't matter. As long as it isn't blank or zero
}
现在,查看您的数据是否在您的阵列中非常快。只需查看它是否是%array_index
中的关键字:
my $item = "Delta"; # Is this in my initial array?
if ( $array_index{$item} ) {
say "Yes! Item '$item' is in my array.";
}
else {
say "No. Item '$item' isn't in my array. David sad.";
}
这很常见,你会看到许多程序使用map命令来索引数组。而不是那个for
循环,我本可以做到这一点:
my %array_index = ( map { $_ => 1 } @array );
或
my %array_index;
map { $array_index{$_} = 1 } @array;
你会看到两者。第一个是一个班轮。 map
命令获取数组中的每个条目,并将其放入$_
。然后,它将结果返回到数组中。因此,map
将返回一个数组,其数据位于偶数位置(0,2,4 8 ...),奇数位置为1(1,3,5) ...)。
第二个更文字,更容易理解(或者在map
命令中易于理解)。同样,@array
中的每个项目都被分配到$_
,并且被用作%array_index
哈希中的密钥。
是否要使用哈希值取决于数组的长度以及您要搜索的输入项数。如果您只是搜索单个项目是否在您的数组中,我可能会使用List::Utils
或List::MoreUtils
,或使用for
循环来搜索我的数组的每个值。如果我为多个值执行此操作,我最好使用哈希值。