【Perl】リファレンスの備忘録

ハッシュの配列とか、配列のリファレンスとか。
こんがらがってきたので、一応メモ程度に。
$h1{a}と$h1->{a}は違うので注意〜。
前者はハッシュの参照?で、後者はハッシュのリファレンスの参照。

#!usr/bin/perl

use strict;
use Data::Dumper;

my %h_a; # ハッシュの配列
my %h1; # ハッシュ
my $array_ref; # 配列のリファレンス

$h1{a} = 1;
$h1{b} = 2;


print '$h1{a}は', $h1{a}, "\n"; 
print '$h1{b}は', $h1{b}, "\n"; 

# 引数はハッシュのリファレンス、
# 戻り値は配列のリファレンス
$array_ref = &test(\%h1);

# 戻り値である配列のリファレンスを「@」でデリファレンス
# $hはハッシュのリファレンス	
foreach my $h (@$array_ref) {
	# 配列にハッシュのリファレンスを入れる
	push (@{$h_a{A}}, $h);
	print Dumper \%h_a;
}

# 配列のリファレンスに入れた値を見てみる
foreach my $h (@{$h_a{A}}) {
	print Dumper \%h_a;
	# $hはハッシュのリファレンスなので「->」で参照する
	print '$h1{a}は', $h{a}, "\n"; # 参照×(実行時はコメントアウトか何かしてね)
	print '$h1{a}は', $h->{a}, "\n";
}

# 今度はBの方にハッシュのリファレンスを入れる
push (@{$h_a{B}}, \%h1);

foreach my $h (@{$h_a{B}}) {
	print Dumper \%h_a;
	print '$h1{b}は', $h{b}, "\n"; # 参照×(実行時はコメントアウトか何かしてね)
	print '$h1{b}は', $h->{b}, "\n";
}

sub test {
	my ($h1) = @_;
	my @array;

	$h1{c} = 3;

	push (@array, $h1);

	return \@array;
}