--- title: ハッシュの勉強 author: kazu634 date: 2008-01-18 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。
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"; }