Perlのリファレンスとデリファレンス早見表
今更感満載の小ネタです。
久々に触ったら少し忘れていたので表にしときます。
せっかくなんで例も
こんな感じで変数が定義されている場合。
my $sc = 100; my @list = ( "abc", "def", "ghi" ); my %hash = ( "one" => 1, "two" => 2 );
関数に各変数のリファレンスを渡したい場合は以下のようにします。
func( \$sc, \@list, \%hash );
次にデリファレンス。
関数内では以下のように引数を受け取っているものとします。
sub func { my ($ref_sc, $ref_list, $ref_hash) = @_; : }
「$ref_sc」「$ref_list」「$ref_hash」はそれぞれの変数のリファレンスであるため,
値を参照する場合にはデリファレンスをする必要があります。
スカラーなら先頭に「$」,リストなら先頭に「@」,ハッシュなら先頭に「%」を付与します。
sub func { my ($ref_sc, $ref_list, $ref_hash) = @_; print "sc = $$ref_sc\n"; print "list begin\n"; foreach ( @$ref_list ) { print "$_\n"; } print "list end\n"; print "hash begin\n"; foreach ( keys %$ref_hash ) { print "key:$_ value:$$ref_hash{$_}\n"; } print "hash end\n"; }
もちろん,関数内で値を変更すればコール元の変数にも影響を与えます。
sub func { : $$ref_sc = 200; push( @$ref_list, "jkl" ); $$ref_hash{"three"} = 3; }
なお,間違った型でデリファレンス(リストなのに%をつけたり)すると
何か例外が飛ぶのか,特に対処をしないとスクリプトの実行がそこで停止するようです。