Поиск хэша в массиве по значению - PullRequest
6 голосов
/ 01 июня 2009

У меня есть функция, которая извлекает данные 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;
    }
}

Заполнение массива хэшей в порядке. Однако трудной частью является поиск определенного элемента (хеша) в массиве. Я не могу найти предметы, которые могут иметь идентификатор или 21, или пакетную партию 15, или стоимость> $ 20 и т. Д.

Как бы я мог реализовать такую ​​функцию поиска?

Спасибо всем,

Ответы [ 2 ]

20 голосов
/ 01 июня 2009

С силой grep

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

Если вы знаете, что будет возвращен только один предмет, вы можете просто сделать это:

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

(Не проверено, и я давно не писал ни одного из них, но это должно работать)

5 голосов
/ 01 июня 2009

Если вы уверены, что поиск всегда возвращает только один случай или если вас интересует только первое совпадение, вы можете использовать подпрограмму 'first', найденную в List :: Util

use List::Util;

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

Я вложил вызов подпрограммы в блок % {} , чтобы убедиться, что RHS оценивает хеш.

...