Memoize |
BasicWerk
EC Support
Technique
Facebook
|
20141225233033_Perl_hash_array_reference |
Perl_hash_array_reference
Perl でハッシュの value に配列を (リファレンスで) 格納する。
こんな TSV があるとしよう。 sample_items.tsvitem price qty plant 3000 8 page 2500 12 jones 9000 3 bonham 8900 1
item を key にして、price, qty を配列リファレンスで value として紐付ける。 value に price * qty を sum として追加し、TSV として書き出す。 sample_hash_array_ref.pl #! /usr/bin/perl use warnings; use strict; # TSV filename my $tsv_file = shift; # データ格納用のハッシュ my %hash; # item の並びを覚えておく my @row_keys = (); open my $in, "<", $tsv_file; while ( my $line = <$in> ) { # skip header next if $. == 1; # key はスカラー、value は配列リファレンス chomp $line; my ( $key, @values ) = split /\t/, $line; $hash{$key} = [@values]; push @row_keys, $key; } close $in; # 配列のリファレンスに price * qty = sum を追加する foreach my $key ( keys %hash ) { # 配列リファレンスに対しての要素の取り出し my ( $price, $qty ) = @{ $hash{$key} }; # 相手がリファレンスでも普通に push が使える push $hash{$key}, ( $price * $qty ); } # 出力 print join( "\t", qw( item price qty sum) ), "\n"; foreach my $key (@row_keys) { print join( "\t", ( $key, @{ $hash{$key} } ) ), "\n"; }
実行してみる。 % chmod a+x sample_hash_array_ref.pl % sample_hash_array_ref.pl sample_items.tsv item price qty sum plant 3000 8 24000 page 2500 12 30000 jones 9000 3 27000 bonham 8900 1 8900
ポイントは、
の2点。
|
© Shin Nakamura/BasicWerk 2008 - 2014 |