perl/リファレンスとデリファレンス〜配列の中にハッシュ、ハッシュの中に配列〜
最近、リファレンスとデリファレンスでいろいろするのにはまってます。実験が一通り済んだら、リファレンスとデリファレンスについて改めてまとめます。いろいろいじって実験するの、やっぱり楽しい。。。
#! usr/bin/perl use strict; use warnings; use Data::Dumper; # ◎値に配列を持つハッシュ(配列のハッシュ my %hash1=( komatsu=>[25,'f','Okayama',19821227], kogematsu=>[22,'m','Akita',19850625], hagematsu=>[36,'m','Okinawa',19530429], mogematsu=>[66,'f','Hokkaido',19570807] ); print Dumper \%hash1; print "\n"; # 配列をもう一つ追加してみましょう。 $hash1{oomatsu}=[89,'f','America',19320113]; print Dumper \%hash1; # デリファレンスしてみましょう print $hash1{hagematsu}[2],"\n"; #出力結果=>Okinawa print ${$hash1{hagematsu}}[2],"\n"; #上のprint文と等価 print @{$hash1{hagematsu}},"\n"; #出力結果=>36mOkinawa19530429=>「""」で囲んでないから「@」が展開されないため、つながって出力される。 print "@{$hash1{hagematsu}}\n"; #出力結果=>36 m Okinawa 19530429 print "\n"; # ◎要素にハッシュを持つ配列(ハッシュの配列 my @array1=( { a=>"hello", b=>"good" }, { c=>"come", d=>"distance", e=>"energy" }, { f=>111, g=>222, h=>333, i=>444 } ); print Dumper \@array1; print "\n"; # 要素を追加してみましょう push (@array1,{j=>'AA',k=>'BCG'},{l=>'o3ej',m=>'j2dj'}); print Dumper \@array1; print "\n"; # デリファレンスしてみましょう print %{$array1[3]},"\n"; #出力結果=>kBCGjAA=>デリファレンスした値の型は、ハッシュのため「%」を使用する。 print "\n"; print ${$array1[3]}{k},"\n"; #下の一行と等価=>keyが{k}のものをデリファレンスした値は、スカラーのため「$」を使用する。 print $array1[3]->{k},"\n"; #出力結果=>BCG print "\n"; # 配列すべてをデリファレンスしてみよう。 foreach (@array1){ print %$_,"\n"; };#配列の要素はリファレンスなので、「%」を$_の前に付けてデリファレンスする。デリファレンスした中身はハッシュのため、「%」。 print "\n"; for my $x (@array1){ print "{\n"; for my $y (keys (%{$x})){ print " $y=>$x->{$y},\n";# 考え方=>${$array1[0]}{a}='hello'というのが成り立つ。今、$array1[0]が$xで、aが$bなので、それぞれ置き換えてみる。 }; print "},\n"; }; print "\n"; for my $x (@array1){ print "{\n"; for my $y (keys (%{$x})){ print " $y=>${$x}{$y},\n"; # $y=>$x->{$y}と等価 }; print "},\n"; };