Perl の配列とハッシュのテクニック (1)
ボクはまだまだ初歩レベルなので、とりあえず3つ + 1。
「常識レベル」のものから、「便利だなぁ」と感じたものまで。
参考図書
id:perlcodesample こと 木本裕紀 さんの本でした。
「かんたん」で解りやすいサンプルが豊富なので、独学にぴったり。二色刷りで見やすいです。
正誤が多いのが、ちょっとアレですけれど。
配列の昇順ソート
my @nums = (4, 10, 2, 9, 8,); @nums = sort { $a <=> $b } @nums; # (2, 4, 8, 9, 10) #通常のソートだと10が先頭にきてしまう…… @nums = sort @nums; # (10, 2, 4, 8, 9)
降順にしたければ $a と $bをひっくり返せばOK。
@nums = sort { $b <=> $a } @nums; # (10, 9, 8, 4, 2)
配列の要素から重複を取り除く
配列の各要素をハッシュのキーにして、keys関数でキーを取り出す
my @array = qw / a b c d c a e /; my %no_duplicate_hash; foreach my $element (@array) { $no_duplicate_hash{$element} = 1; } my @no_duplicate_array = keys %no_duplicate_hash; # (e, c, a, b, d)
ハッシュにいれてるから順番が変化してるのかな。
代入するときに、ソートすれば使いやすい……かも。
... 略 ... my @no_duplicate_array = sort keys %no_duplicate_hash; # (a, b, c, d, e)
配列の要素の個数を調べる
配列の各要素をハッシュのキーにして、値をインクリメントする
my @array = qw / v w x x v z y x w v x y z v x /; my %no_duplicate_hash; foreach my $element (@array) { $no_duplicate_hash{$element}++; } # (y => 2, w => 2, x => 5, v => 4, z => 2)
出力するならキーでソートしたほうが良いかも。
foreach my $key ( sort keys %no_duplicate_hash ){ print "$key -> $no_duplicate_hash{$key}\n"; }
v -> 4
w -> 2
x -> 5
y -> 2
z -> 2
コメントいただきました
id:syohex さん、ありがとうございます。
たしかにeachのほうがタイプ数が減る && 何をしているかが解りやすいです。
while (my ($key, $value) = each(%no_duplicate_hash)) { print "$key -> $value\n"; }
調べれば調べるだけ勉強することが増えていくので、なかなか追いつきませんが……頑張っていきます。
以上!
おまけ
やればやるほど感じるのが、Perl は先人の小技と知の宝庫なんですね!
コードを読むのが楽しいことを教えてくれた、素晴らしい言語だと感じます。
で、Perlのスローガン「There's more than one way to do it」について調べていたら見つけたエントリ。
とても良かった!
TMTOWTDIの謎を探る(調査報告:単純さと複雑さの関係とは?)
Perl がもうちょっとだけ好きになれました。