Memoize

BasicWerk   EC Support   Technique   Facebook  

20141225233033_Perl_hash_array_reference

Perl_hash_array_reference

 

 

Perl でハッシュの value に配列を (リファレンスで) 格納する。

 

こんな TSV があるとしよう。

sample_items.tsv
 
item	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
 

 

ポイントは、

  1. 配列リファレンスをハッシュの値にした時の取り出し方 @{ $hash{$key} }
  2. ハッシュの値が配列のリファレンスであっても push 関数に渡すのはリファレンス (つまりスカラー値) そのままでよい

の2点。

 


© Shin Nakamura/BasicWerk 2008 - 2014