perl/リファレンスとデリファレンス

ポイントは以下。

●リファレンス=変数が格納されているエリアの参照値(アドレス値)を求めるとき
変数の前に「\」を付ける。

●デリファレンス=リファレンスが指すエリア(アドレス)に格納されている値を取得するとき
変数の前に、変数のタイプに従い「$」「%」「@」をつける。

実験したコードは以下。

#! usr/bin/perl

use strict;
use warnings;

# ◎スカラー変数のリファレンスとデリファレンス
my $word = "koma";
print $word,"\n";         #出力結果=>koma=>$wordに格納されている「koma」が返る

# $wordのリファレンス(アドレス値)をprintしてみよー。
my $ref_word = \$word;
print $ref_word,"\n";     #出力結果=>SCALAR(0x8017f4)=>$wordのアドレス値

# $ref_wordのデリファレンスをprintしてみよう
print $$ref_word,"\n";    #出力結果=>koma=>$wordに格納されている「koma」が返る

print "\n";



# ◎配列変数のリファレンスとデリファレンス
my @array = ("x",1432111111,'yy');
print "@array\n";         #出力結果=>x 1432111111 yy=>@arrayの中身が返っている

# @arrayのリファレンスをprintしてみよー。
print "\@array\n";        #出力結果=>@array=>「""」で囲んで「\」を@arrayの前に付けてるから>、文字列としてprintされちゃった。
print \@array,"\n";       #出力結果=>ARRAY(0x8219b4)=>@arrayの住所(アドレス値)

print "\n";

my $ref_array=\@array;    #リファレンス値はスカラー値なので「$」を使用し、@arrayの住所を代>入します。
print $ref_array,"\n";    #出力結果=>ARRAY(0x821bb4)

# デリファレンスをprintしてみよう。
print "@$ref_array\n";
print "\n";

# デリファレンスで配列の要素の値も返すことができる!
print $$ref_array[2],"\n";
print $$ref_array[0],"\n";
print $$ref_array[1],"\n";

print "\n";

# 矢印演算子を使っても、配列の要素の値をデリファレンスで返すことができる!
print $ref_array->[2],"\n";
print $ref_array->[0]."\n";
print $ref_array->[1]."\n";

print "\n";



# ◎ハッシュ変数のリファレンスとデリファレンス
my %hash = (
    koma=>234,
    gama=>"sssss",
    jima=>"4k2nibks"
);

foreach(keys (%hash)){
    print "$_=>$hash{$_}\n";
};
print "\n";

print %hash,"\n";
print "\n";

# リファレンスをprintしてみよう。
print \%hash,"\n";       #出力結果=>HASH(0x819368)=>リファレンスが返ります。
print "\%hash\n";        #出力結果=>%hash=>「""」で囲んでいるので、文字列として%hashが認識>されています。

my $ref_hash=\%hash;
print $ref_hash,"\n";    #出力結果=>HASH(0x819368)=>リファレンスが返ります。

# デリファレンスをprintしてみよう。
#print %\%hash,"\n";     #構文エラーになるよ。
print %$ref_hash,"\n";   #出力結果=>koma234jima4k2nibksgamasssss

print "\n";

# デリファレンスでハッシュの要素の値も返すことができる!
print $$ref_hash{koma},"\n";
print $$ref_hash{gama},"\n";
print $$ref_hash{jima},"\n";

print "\n";

# 矢印演算子を使っても、ハッシュの要素の値をデリファレンスで返すことができる!
print $ref_hash->{koma},"\n";
print $ref_hash->{gama},"\n";
print $ref_hash->{jima},"\n";

print "\n";