Gaiax TechEgg's Blog

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

基礎① 6.リファレンスをやってみた

今回はリファレンスに関してやっていきます:)
私もつまづいたリファレンス・・・。。。

ハッシュ
gaiax-techegg.hatenablog.com
や配列

gaiax-techegg.hatenablog.com


をおさらいしておくとベターかもです。
この回でも例もたくさん載せているので、ぜひ書いて動かしてみてください!

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

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



リファレンス

スカラー・配列・ハッシュなどの変数は、データを記録するためのものです。それに対して、リファレンスは値を記録する代わりに、値を格納しているアドレスを記録します。これをすることによって二次元配列など複雑な構造などを作成することができます。これから登場しますが、サブルーチンなどで引数をわたすときに複数の配列やハッシュが指定可能になります。

・スカラー変数 / 配列 / ハッシュ:ユーザが指定した値を記録し、後から変数名を使ってその値を呼び出すためのもの
・リファレンス:変数名にリンクされたアドレスを記録する操作
・デリファレンス:リファレンスから元のスカラーや配列やハッシュなど値を得るための操作


リファレンスする場合はスカラー変数・配列・ハッシュのそれぞれのシジルの前に\(バックスラッシュ)を置くことでリファレンス操作ができます。

二次元配列

このようなテーブル型のように縦横の二次元で配列を考えた場合のことを指します。基礎① 4.配列で出てきた配列は、縦のみの一次元配列のことです。

number name place famous
no1 Tokyo Japan TokyoTower
no2 Paris France EiffelTower


この場合、Tokyoの要素はtable[1][1]EiffelTowerの要素はtable[2][3]になります。

デリファレンス

リファレンスでは値そのものではなく、アドレスを得ることができます。アドレスではなく値を直接得たいときは、デリファレンスをすると、元のスカラーや配列やハッシュなど値そのものを得ることができます。

デリファレンスする場合はリファレンスの前にスカラー変数・配列・ハッシュのそれぞれのシジルを置くことでデリファレンス操作ができます。

いざスタート!


1. リファレンス

スカラー・配列・ハッシュをそれぞれリファレンスしてみましょう。
リファレンスする場合はスカラー変数・配列・ハッシュのそれぞれのシジルの前に\(バックスラッシュ)を置くことでリファレンス操作ができます。

◼︎スカラーのリファレンス

my $scalar     = "scalar";
my $scalar_ref = \$scalar;
print "$scalar_ref\n";


SCALAR(0x7f906a81fed0)

◼︎配列のリファレンス

my @array     = ( "apple", "blue", "cat" );
my $array_ref = \@array;
print "$array_ref\n";

または[角括弧]で配列の要素をくくることで、配列リファレンスになります。

my $array_ref = [ "apple", "blue", "cat" ];
print "$array_ref\n";


ARRAY(0x7f97998248d0)


配列をリファレンス化するときにシジルが@から$に変わっているのは、配列全体が一つの変数としてアドレスに収納されるからです。一つの変数=スカラー変数でしたね!なのでシジルは$になります。

◼︎ハッシュのリファレンス

my %hash     = ( name => "micky",
                place => "DisneyLand" );
my $hash_ref = \%hash;
print "$hash_ref\n";

または{波括弧}でくくることで、ハッシュリファレンスになります。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "$hash_ref\n";


HASH(0x7fa453823cd0)


配列と同様に、ハッシュをリファレンス化するときにシジルが%から$に変わっているのは、ハッシュ全体が一つの変数としてアドレスに収納されるからです!
上記のようにリファレンスはSCALAR(アドレス)ARRAY(アドレス)HASH(アドレス)で出力されます。( )内は実行環境によって異なります。値そのものではなく、アドレスが表示されます。

2. デリファレンス

リファレンスで、アドレスを参照してきました。リファレンスしたものをデリファレンスすることで値そのものを参照してみましょう!
デリファレンスする場合はリファレンスしたもの前にスカラー変数・配列・ハッシュのそれぞれのシジルを置くことでデリファレンス操作ができます。

◼︎スカラーデリファレンス

my $scalar     = "scalar";
my $scalar_ref =\$scalar;
print "$$scalar_ref\n";


scalar

◼︎配列のデリファレンス

1.配列の中身を参照

my $array_ref = [ "apple", "blue", "cat" ];
print "@$array_ref\n";


applebluecat

2.要素の取り出し
配列リファレンスをスカラーとしてデリファレンスして{ }でくくり、添え字と出力すると、通常の配列のように出力できます。

my $array_ref = [ "apple", "blue", "cat" ];
print "$array_ref->[2]\n";


cat

◼︎ハッシュのデリファレンス

1.ハッシュの中身を展開
keyとvalueが展開されます。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "%$hash_ref\n";


namemickyplaceDisneyLand

2.要素を取り出す場合
配列のデリファレンスと同じように、ハッシュリファレンスをスカラーとしてデリファレンスして{ }でくくり、keyを入力するとそれに対応するvalueが得られます。

my $hash_ref = {
    name  => "micky",
    place => "DisneyLand"
};
print "$hash_ref->{place}\n";


DisneyLand

3.モジュールを使ってみる

リファレンスのあと、デリファレンスで中身を一回一回確認するのはなかなか苦労がかかります・・・そこで!!Data::Dumperモジュールを使ってみましょう!

use Data::Dumper;
my $hash_ref = {
   name      => "micky",
   place     => "DisneyLand",
   friend    => "minne"
};

print Dumper($hash_ref);


$VAR1 = {
          'name' => 'micky',
          'friend' => 'minne',
          'place' => 'DisneyLand'
        };


print Dumper()で( )の中身を一気に見ることができます!モジュールも使いようですね!


どうでしたか?
リファレンスでは今までの変数についての内容を使いましたね!
モジュールも知っておくと手間が省けるようになりますね!
これからも紹介していきます!

次回はサブルーチンについてです!:)
サブルーチン楽しいですよー!お楽しみに!