8

次のように、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 を超えるアイテムが見つからないようです。

このような検索機能を実装するにはどうすればよいでしょうか?

ありがとうございます、

4

2 に答える 2

22

grepの力で

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

返されるアイテムが 1 つだけであることがわかっている場合は、次のようにすることができます。

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

(未テストで、これらのいずれかをしばらく書いていませんが、これは機能するはずです)

于 2009-06-01T10:24:28.360 に答える
5

検索が常に 1 つの出現のみを返すことが確実な場合、または最初の一致のみに関心がある場合は、 List::Utilにある「最初の」サブルーチンを使用できます。

use List::Util;

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

サブルーチン呼び出しを%{ }ブロックで囲んで、RHS が確実にハッシュに評価されるようにしました。

于 2009-06-01T12:33:14.450 に答える