--- title: ハッシュの勉強 author: kazu634 date: 2008-01-18 url: /2008/01/18/_809/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3625;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---

 『新版Perl言語プログラミングレッスン入門編』を見ながらPerlの勉強中。ハッシュのところを現在読んでいる。ちなみにハッシュというのは

連想配列(れんそうはいれつ)とは、プログラミング言語において、添え字に文字列等のスカラー数値以外のデータ型も使用できる配列である。抽象データ型のひとつ。連想コンテナ、辞書とも呼ばれる。

連想配列 – Wikipedia

ということで、配列の一種で添え字が数字ではないものだそうです。言われてみると、ハッシュってそういう構造をしている。調べて良かったWikipedia。


ハッシュの基本

use strict;
use warnings;
my %hash = (
'Kazu' => 26,
'Take' => 24,
'Yukari' => 23,
);
foreach my $key (keys(%hash)){
my $value = $hash{$key};
print "$key --> $value\n";
}

こんな感じで使うらしい。foreachのところはイディオムらしいので丸暗記推奨とのことらしい。このイディオムは別な書き方として

foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}

でもよい。

ハッシュに要素を追加する

 基本的に

$hash{$key} = $value;

という形式で書けば大丈夫。%じゃなくて$だよ。

 例はこんな感じになる。ここでは’Nanbu’をキーとする値を%hashに追加している。

use strict;
use warnings;
my %hash = (
'Kazu' => 26,
'Take' => 24,
'Yukari' => 23,
);
print "not added yet:\n";
foreach my $key (keys(%hash)){
my $value = $hash{$key};
print "$key --> $value\n";
}
$hash{'Nanbu'} = 20;
print "\nadded:\n";
foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}

ハッシュで同じキーを使った場合

 一つのハッシュの中に同じキーが二つ存在することはないので、すでに存在するキーを用いて代入を行うと元の値は失われます。だから、

use strict;
use warnings;
my %hash = (
'Kazu' => 26,
'Take' => 24,
'Yukari' => 23,
);
print "\nNot Chnage the value yet\n";
foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}
print "\nchange value:\n";
$hash{'Kazu'} =13;
foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}

というようにすると、$hash{‘Kazu’}の値が変わることになる。

キーによる並び替え

 ハッシュではキーと値の組の順番を気にする必要はないけど、目で見るときには並び替えたくなるんだよ!そういうときはsortを使うよ。

use strict;
use warnings;
my %hash = (
'Kazu' => 26,
'Take' => 24,
'Yukari' => 23,
);
print "\nNot Sorted:\n";
foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}
print "\nSorted:\n";
foreach (sort keys %hash){
print "$_ --> $hash{$_}\n";
}

値による並び替え

 値で並び替えるときもsortを使うけどごにゃごにゃしてよくわからないや。とりあえずこんな感じらしい。

use strict;
use warnings;
my %hash = (
'Kazu' => 26,
'Take' => 24,
'Yukari' => 23,
);
print "\nNot Sorted:\n";
foreach (keys %hash) {
print "$_ --> $hash{$_}\n";
}
print "\nSorted:\n";
foreach (sort { $hash{$a} <=> $hash{$b} } keys %hash) {
print "$_ --> $hash{$_}\n";
}

ハッシュの実例 -配列の要素から重複を除いたリストを作るよ-

use strict;
use warnings;
my %uniq;
my @array = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);
foreach (@array) {
$uniq{$_} = 1;
}
my @uniqarray = keys (%uniq);
print "@uniqarray\n";

ハッシュの実例 -配列の中から値の出現頻度を調べるよ-

use strict;
use warnings;
my %uniq;
my @array = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5);
foreach (@array) {
$uniq{$_}++;
}
print "値, 出現回数\n";
foreach (keys %uniq) {
print "$_, $uniq{$_}\n";
}

keys, values, exitsts, delete, undef

keys(%hash)
ハッシュの中にあるキーをすべてリストにして返す関数
values(%hash)
ハッシュの中にある値をすべてリストにして返す関数
exists($hash{$key})
ハッシュの中にあるキーが存在するかどうかを調べる関数
delete $hash{$key}
ハッシュの中からあるキーとその値を削除する関数
undef %hash
ハッシュの中からすべてのキーと値を削除する関数