【发布时间】:2013-12-03 16:19:56
【问题描述】:
虽然 perl 我仍然在摸索,所以可能有一种简单的方法可以做到这一点,但我可以找到它。我想将A 或E 等单个值与可能包含或不包含该值的数组(例如A B C D)进行比较,然后在它们匹配时执行操作。我应该如何设置?
谢谢。
【问题讨论】:
标签: perl
虽然 perl 我仍然在摸索,所以可能有一种简单的方法可以做到这一点,但我可以找到它。我想将A 或E 等单个值与可能包含或不包含该值的数组(例如A B C D)进行比较,然后在它们匹配时执行操作。我应该如何设置?
谢谢。
【问题讨论】:
标签: perl
您过滤数组的每个元素以查看它是否是您要查找的元素,然后将生成的数组用作布尔值(非空 = 真,空 = 假):
@filtered_array = grep { $_ eq 'A' } @array;
if (@filtered_array) {
print "found it!\n";
}
【讨论】:
any from List::MoreUtils。
如果您将列表存储在数组中,那么唯一的方法是在循环中单独检查每个元素,使用 List::MoreUtils 中的 grep、for 或 any。 (grep 是其中最差的,因为它搜索 整个 数组,即使早期已经找到匹配项。)如果数组很小,这很好,但你会遇到性能问题如果数组的大小很大并且您必须经常检查它。
您可以通过在哈希中表示相同的列表来加快速度,而检查成员资格只是一个键查找。
或者,如果列表很大,那么最好将其保存在数据库中,使用SQLite。
【讨论】:
你被数组困住了吗?
每当您在 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 循环来搜索数组的每个值。如果我对多个值执行此操作,我最好使用哈希。
【讨论】:
map - $array_index{$_} = 1 for @array 也可以,但更惯用。这些天,我实际上会使用一个切片@$_{@array} = () for \my %array_index;,然后询问一个特定的元素exists。