与数组的比较

时间:2013-11-19 22:00:25

标签: perl

我仍然感觉我的方式虽然perl所以可能有一个简单的方法,但我可以找到它。我想将单个值AE与可能包含或不包含该值的数组进行比较,例如A B C D,然后在匹配时执行操作。我该如何设置?

感谢。

3 个答案:

答案 0 :(得分:2)

您过滤数组的每个元素以查看它是否是您要查找的元素,然后将结果数组用作布尔值(不是empty = true,empty = false):

@filtered_array = grep { $_ eq 'A' } @array;
if (@filtered_array) {
    print "found it!\n";
}

答案 1 :(得分:1)

如果您将列表存储在数组中,那么唯一的方法是使用grepforany 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::UtilsList::MoreUtils,或使用for循环来搜索我的数组的每个值。如果我为多个值执行此操作,我最好使用哈希值。