Perl入門 ≫ LESSON6 ハッシュ
ハッシュの基本
昔は連想配列と呼んでいました。自分もPerlを学習したのはかなり昔なので、どうもハッシュと言わずに連想配列と呼んでしまう場合があるかもしれませんが、ご了承ください。
ですが、言葉的には連想配列と呼んだ方が理解しやすいと思います。
配列と言うからには、ハッシュもリストです。
が、普通の配列は添え字の数字ごとにリストとしてデータが並んでいますが、ハッシュは添え字の代わりに何かKEYとなる数字や文字と、それと対になる値で編成されます。
例えば
名前 | パスワード |
---|---|
user1 | pass1 |
user2 | pass2 |
user3 | pass3 |
こんなような組み合わせのデータがあります。3人の名前とパスワードの対です。
名前のデータは重複することはありません。
これをハッシュであらわすと次の様になります。
%hensu = ('user1'=>'pass1',
'user2'=>'pass2',
'user3'=>'pass3')
ハッシュ変数は、%に続いて変数名を付けて表します。
KEYとその値を=>で繋いで宣言します。
最初の2つの場合、KEYが'user1'、その値が'pass1'となります。
あとの二つも同様。
KEYとなる名前を指定すれば、その値(この場合パスワード)を直ちに取り出すことができます。
値を参照してみましょう。
$変数名{KEY}
で値を参照・代入することができます。
my %hensu = ('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
print "key 'user1' data = $hensu{'user1'}\n";
print "key 'user2' data = $hensu{'user2'}\n";
print "key 'user3' data = $hensu{'user3'}\n";
結果は以下。
key 'user1' data = pass1
key 'user2' data = pass2
key 'user3' data = pass3
よって、KEYはハッシュの中で一意でなくてはなりません。
ようするに、同じ名前のKEYを複数作ってはいけないということです。というか、作ろうとしても作れません。すでにあるKEYの値として上書きされます。
各KEYの値(VALUE)は同じでもかまいません。
値を入れたり、新しく作ったりしてみましょう。
途中で値を代入する場合、普通に「=」でOKです。「=>」は宣言時だけです。
my %hensu = ('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
print "key 'user1' data = $hensu{'user1'}\n";
print "key 'user2' data = $hensu{'user2'}\n";
print "key 'user3' data = $hensu{'user3'}\n\n";
$hensu{'user2'} = 'pass2_1';
#KEY'user2'の値を変更します。
print "key 'user2' data = $hensu{'user2'}\n\n";
$hensu{'user5'} = 'pass5';
#KEY'user5'の値を追加します。
print "key 'user5' data = $hensu{'user5'}\n";
結果は以下。
key 'user1' data = pass1
key 'user2' data = pass2
key 'user3' data = pass3
key 'user2' data = pass2_1
key 'user5' data = pass5
KEYとVALUE
KEYとVALUEを取り出すにはどうしたらいいでしょう。
取り出したKEYもVALUEも複数ありえますから、配列になっています。
my %hensu = ('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
my @key = keys %hensu;
#KEYを取り出します。
my @value = values %hensu;
#VALUEを取り出します。
print "KEYS : @key\n";
print "VALUES : @value";
結果は以下。
KEYS : user1 user2 user3
VALUES : pass1 pass2 pass3
KEYとVALUEをそれぞれ配列に取り出せました。
取り出した値ですが、user1 user3 user2 というように、データの宣言順になっていない場合があります。
ハッシュの値はデータの宣言順になりません。覚えて置いてください。
削除
ハッシュのデータを削除してみましょう。
値を削除する時は""でも代入しておけばいいのですが、一度作ってしまったKEYを削除するにはどうしたらいいでしょうか?
削除にはdeleteを使います。
my %hensu = ('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
delete $hensu{'user3'};
my @key = keys %hensu;
print @key;
結果は以下。
user1 user2
KEY'user3'とその値が削除されました。
ハッシュのリファレンス
ハッシュへのリファレンスを作ってみます。
ハッシュへのリファレンスでは、値を参照するのに
$参照名{'xxx'}
とはできません。
アロー演算子「->」を使います。
$参照名->{'xxx'}
という具合です。
my %hensu = ('user1'=>'pass1','user2'=>'pass2','user3'=>'pass3');
my $hensu1 = \%hensu;
print $hensu1->{'user1'};
参照名は「変数」です。ハッシュではないので。$hensu1になります。%hensu1にはなりません。
結果は以下。
pass1
KEY名は
$hensu1->{user1}
としても同じです。