17 KiB
17 KiB
title | author | date | url | wordtwit_post_info | categories | ||
---|---|---|---|---|---|---|---|
ハッシュの勉強 | kazu634 | 2008-01-18 | /2008/01/18/_809/ |
|
|
『新版Perl言語プログラミングレッスン入門編』を見ながらPerlの勉強中。ハッシュのところを現在読んでいる。ちなみにハッシュというのは
連想配列(れんそうはいれつ)とは、プログラミング言語において、添え字に文字列等のスカラー数値以外のデータ型も使用できる配列である。抽象データ型のひとつ。連想コンテナ、辞書とも呼ばれる。
ということで、配列の一種で添え字が数字ではないものだそうです。言われてみると、ハッシュってそういう構造をしている。調べて良かった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
- ハッシュの中からすべてのキーと値を削除する関数