按值搜索数组中的哈希值

时间:2009-06-01 10:11:06

标签: arrays perl hash perl-data-structures

我有一个函数可以将Excel数据提取到一个哈希数组中,如下所示:


sub set_exceldata {

    my $excel_file_or = '.\Excel\ORDERS.csv';
    if (-e $excel_file_or) {

        open (EXCEL_OR, $excel_file_or) || die("\n can't open $excel_file_or: $!\n");                   
        while () {

            chomp;
            my ( $id, $date, $product, $batchid, $address, $cost ) = split ",";
            my %a = ( id      => $id
                    , date    => $date
                    , product => $product
                    , batchid => $batchid
                    , address => $address
                    , cost    => $cost
                    );
            push ( @array_data_or, \%a );
        }
        close EXCEL_OR;
    }
}

填充哈希数组很好。但是,困难的部分是在数组中搜索特定项(哈希)。我似乎无法找到可能具有id或21,或batchid为15或成本>的项目。 20美元等。

我如何实施这样的搜索工具?

感谢所有人,

2 个答案:

答案 0 :(得分:20)

拥有grep

的力量
my @matching_items = grep {
  $_->{id} == 21
} @array_data_or;

如果您知道只返回一件商品,您可以这样做:

my ($item) = grep {
  $_->{id} == 21
} @array_data_or;

(未经测试,我暂时没有写过其中一篇,但这应该有效)

答案 1 :(得分:5)

如果您确定搜索始终只返回一次,或者您只对第一次匹配感兴趣,那么您可以使用List::Util中找到的“第一个”子程序

use List::Util;

my %matching_hash = %{ first { $_->{id} == 21 } @array_data_or };

我将子程序调用包含在%{} 块中,以确保RHS评估为哈希值。