| 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 
 ポイントは、 
 の2点。 
 | 
| © Shin Nakamura/BasicWerk 2008 - 2014 |