按值搜索数组中的哈希值

6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢大家,

Que*_*tin 20

凭借grep的力量

my @matching_items = grep {
  $_->{id} == 21
} @array_data_or;
Run Code Online (Sandbox Code Playgroud)

如果您知道只返回一个项目,您可以这样做:

my ($item) = grep {
  $_->{id} == 21
} @array_data_or;
Run Code Online (Sandbox Code Playgroud)

(未经测试,我有一段时间没有写过这些,但这应该有效)


aks*_*aks 5

如果你确定搜索总是只返回一次,或者如果你只对第一次匹配感兴趣,那么你可以使用List :: Util中的'first'子程序

use List::Util;

my %matching_hash = %{ first { $_->{id} == 21 } @array_data_or };
Run Code Online (Sandbox Code Playgroud)

我在%{}块中包含了子例程调用,以确保RHS评估为哈希.