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";