読者です 読者をやめる 読者になる 読者になる

kwsktr's study log

kwsktr のおべんきょログ

Perl の配列とハッシュのテクニック (1)

Perl

ボクはまだまだ初歩レベルなので、とりあえず3つ + 1。
「常識レベル」のものから、「便利だなぁ」と感じたものまで。

参考図書

かんたんプログラミング CGI/Perl
かんたんプログラミング CGI/Perl

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 がもうちょっとだけ好きになれました。