Gaiax TechEgg's Blog

非エンジニアがエンジニアを目指すブログ

基礎① 5.ハッシュをやってみた

最近暑いですねー(´-`).。oO
夏バテしてしまって、夕飯アイスな私です。

今回はハッシュについてやっていきたいと思います!:)

エンジニア基礎①
1. Perl環境基礎
2. Hello,world!
3. Perl基礎
4. 配列・for文
5. ⭐️ ハッシュ ⭐️
6. リファレンス
7. サブルーチン
8. 正規表現
9. Amon2 入門 第一部
10. Amon2 入門 第二部


ゴール🏁(めやす:30分)


  • ハッシュがわかる

おさえておきたいこと


ハッシュ

前々回の変数の紹介でも出てきた連想配列のことです。

gaiax-techegg.hatenablog.com


- スカラ変数:一つの要素しか入らない箱
- 配列 / 連想配列:複数の要素を格納できる箱


ハッシュは、前回扱った配列とおなじように、複数の値の格納・取り出しができます。
配列はある変数に複数の要素が組み込まれていました。つまり、Aに対してB,C,D...を組み込み、何番めかを指定して要素を取り出していました。

その点、ハッシュは「Aに対してB」が、「Cに対してD」を呼び出すというふうに、「キー」(=AとかC)と「値」(=BとかD)を一組のペアとして関連づけされていて、完全に1対1の関係を保っています。

「キー」のことを「key」、keyによって指定された「値」のことを「value」といいます。
また、配列のシジルは@でしたが、ハッシュは%をつけます。


では基本の形から詳しく見ていきましょう。

いざスタート!


1. ハッシュ

ハッシュを呼び出すときは$hash{key名}を使います。
シジルが$なのは、配列のときと同じで、ハッシュ変数のなかで1つだけ表示するので、スカラー変数として扱われます。
=>はファットコンマ演算子といい、key => valueというふうに使い、keyとvalueの関係性を表します。

◼︎基本

my %hash = (
   name => "Alice",
   age  => 22
);
print "$hash{name}\n";
print "$hash{age}\n";


1行目:hash変数の定義、要素は()内に入れます
2行目:key:nameにvalue:Aliceを対応付け
3行目:key:ageにvalue:22を対応付け(数値の場合はクォートをつけなくても◎)
4行目:要素の終わり
5行目:key:nameに対応しているvalue:Aliceを取り出す
6行目:key:ageに対応しているvalue:22を取り出す
というふうになります。ハッシュの要素を並べるときは,(カンマ)で区切ります。

上記はこのようなリストと同じ意味になります。

my %hash = ("name","Alice","age","22");
print "$hash{name}\n";


出力結果↓

Alice


この場合はnameというkeyを呼び出したので、Aliceが表示されました。

上記の基本と比べてみると、,と同じ役割ですが、ファットコンマ演算子で関係性を示したほうが視覚的にわかりやすいですね!

◼︎ハッシュの良さ
基本的な形がわかったところで、実際に配列とハッシュの違いを見てみましょう。

my @data = ("Name", "Age", "Birthday");
print "$data[0]\n";

上記の配列において、Nameを取り出したいとします。

my @data = ("Birthday", "Name", "Age");
print "$data[0]\n";

このように、リスト内の順番が入れ替わったとき、「何番めの要素か?」を手掛かりにしてNameを呼び出すため、print "$data[0]\n";だとBirthdayが取り出されてしまうので、添字を書き換えないといけないですね。
ハッシュだと、順番ではなくkeyを手掛かりにvalueを指定するデータ構造になっているので、配列に比べて順序が変わった場合に書き換える必要がないのが便利です。

ハッシュで表した場合は下記のようになります。

my %hash = (
   first    => "Name",
   second   => "Age",
   third    => "Birthday"
);

my $data = delete $hash{second};
print "$data\n";


これからでてきますが、delete関数second(=key)に対応するAge(=value)を指定しています。
もし()内の、first,second,thirdの順番が変わったとしても、表示される内容はAgeで固定されたままです。
これがハッシュと配列の違いです。

2. ハッシュ関数

ハッシュを操作するためにハッシュ関数が用意されています。

関数 内容
keys すべてのキーを取り出す
values すべての値を取り出す
each 1組のキーと値を取り出す
delete 特定の要素を削除・取り出しをする
exists 指定したキーが存在するか確認する


◼︎keys

すべてのkeyを取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = keys %hash;
print "@data\n";


出力結果↓

name age birthday


my @data = keys %hash;で、keys関数がハッシュ%hash@dataという配列として、次の行で順不同で出力しています。

◼︎values

すべての値を取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = values %hash;
print "@data\n";

出力結果↓

Alice 22 19930722


my @data = values %hash;で、values関数がハッシュ%hash@dataという配列として、次の行で順不同で出力しています。

◼︎each

1組のkeyとvalueを取り出します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
my @data = each %hash;
print "@data\n";


出力結果↓

age 22


my @data = each %hash;でどれか1組のkeyとvalueを取り出します。今回はageでしたが、ほかの表示結果もあると思います。

◼︎delete

特定のkeyとvalueを削除・取り出しをします。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
delete $hash{'age'};

key:ageに対応するvalue:22をハッシュ内より消去したので、今ハッシュ内は

my %hash = (
   name     => "Alice",
   birthday => "19930722"
);

のようになっています。
さっきのkeys関数などで呼び出してみると、keyがname birthdayしかないことが確認できます。
また、上記の「◼︎ハッシュの良さ」でも登場しましたが、ひとつのvalueを取り出すこともできます。

◼︎exists

指定したkeyが存在するか確認できます。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);
if (exists $hash{age}){
    print "exist\n";
}


出力結果↓

exist


if文を用いて、ageというkeyが存在するかどうかをexists関数で確認して、存在する場合(この条件に真の場合)「exists」と出力するようにしてます。もし存在しない場合(この条件に偽の場合)は空白のまま何も表示されません。もし偽の場合も表示させるのなら、以下のようにelse文を足します。

my %hash = (
   name     => "Alice",
   age      => "22",
   birthday => "19930722"
);

delete $hash{age};
if (exists $hash{age}){
    print "exist\n";
}else{
    print "not exist\n";
}


delete関数でkey:ageを消していて、存在していないので表示はnot existになったと思います。delete関数で削除したものも、こうして確認ができますね!

以上がハッシュになります!

3. 実践編

ハッシュについてはわかったでしょうか!?でも自分で実際につくってみないと、わからないですよね!今回は実践編として問題を準備しました!ぜひやってみてください。

1.ハッシュを使ってprofile.plで自分のプロフィールを作りましょう(名前、性別、年齢、誕生日、仕事)
2.どれか1組のkeyとvalueを表示させてみましょう
3.表示されたkeyとvalueを削除し、「存在しています」「存在していません」と表示が出るようにしましょう

回答↓
順番に行うと以下のようになります。名前などは自分のプロフィールにおきかえてくださいね!

1,2番までの回答

my %hash = (
   name      => "Marimo",
   sex       => "female",
   age       => "22",
   birthday  => "19930722",
   job       => "student"
);                             #ここまでが1

my @profile = each %hash;
print "@profile\n";            #ここまでが2

3の回答

my %hash = (
   name      => "Marimo",
   sex       => "female",
   age       => "22",
   birthday  => "19930722",
   job       => "student"
);                             #ここまでが1

delete $hash{sex};             #2で表示されたものを消す

if (exists $hash{sex}){
    print "存在しています\n";
}else{
    print "存在していません\n";
}                  #ここまでが3

です!
できましたか!?
自分で色々いじってみるとだんだん使い方が見えてくると思います!
いじり精神が大切です!
これができたらハッシュ完璧です!


次回は最初はだれでも頭が???になる
リファレンス・デリファレンスについてやっていきまーす!:)