Hatena::Groupperl

Press::Alt_R

2010-07-14

Perlわかば (シュウォーツ変換のまえに 1)

  • 配列と配列のリファレンス
  • push ARRAY, LIST
    • ARRAY <==== LIST を追加
#!perl
use strict;
use Data::Dumper;

my @DATA = map{chomp;$_}<DATA>; # remove CRLF and store in ARRAY

# 1. 行データ → 行データ, 比較用数値 のセット
my @id_data=();
foreach my $line (@DATA){
  my @list = split ( ":" ,$line );
  push @id_data,[ ($line,$list[1]) ];
}

print Dumper @id_data;
# 2. 比較用数値でデータをソート

# 3. データセットから行データのみとりだし

__DATA__
Yamada:10:1
Sato:2:1
Kato:5:2
Furukawa:1:1
Suzuki:4:2
Ito:7:3
Yamaoka:3:3
Masuno:6:1
Mizuhara:8:3
Akatsuka:9:1

ポイント:構造的なデータをつくる

pushの説明が少し違っていたので補足します。

今回、@id_dataにそのまま「行データ」と「切り出したID」を入れると、このようになります。

('Yamada:10:1' , 10 , 'Sato:2:1' , 2 , 'Kato:5:2' , 5 .... )

これを後からソートすることは難しそうですね(偶数番目の要素だけを拾ってソートするとか……?)。

ここは、「行データ」と「切り出したID」を、ひとくくりにして、@id_dataに入れておきたいわけです。

( ('Yamada:10:1' , 10) , ('Sato:2:1' , 2) , ('Kato:5:2' , 5) .... )

しかし、これだけだと、そのまま入れるのと同じです。リストの中にリストを入れようとしても、Perlは最終的には、リストを単なる値の羅列と見ていますので、カッコをほどいてしまいます。

そこで、構造的にデータを表現する「データのまとまり」として、リファレンスが必要になるのです。

( ['Yamada:10:1' , 10] , ['Sato:2:1' , 2] , ['Kato:5:2' , 5] .... )

@id_data の中に、このように、「行データ」と「切り出したID」を含む配列のリファレンスを、一つのデータセットにして入れていくことになります

説明不足だった点

[ ] は、リストのリファレンスではなく、配列のリファレンスです。正確には「無名の配列」と呼ばれます(もっと正確には、無名配列コンストラクタ)。

my @arr = (10,20,30);
my $aref = \@arr;

配列を作ってリファレンスをとる、というのを、いきなり

my $aref = [10,20,30];

と書けるようにしてある、というところから、「無名配列」という語感を掴んでいただければと思います。[10,20,30]は、「(10,20,30)という値を含む配列へのリファレンス」ということになりますが、ここで言っている配列には、名前を与えていませんね。

メモ