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 |