結果だけでなく過程も見てください

たい焼きさんの日々の奮闘を綴る日記です。

Perlのリファレンスとデリファレンス早見表

今更感満載の小ネタです。
久々に触ったら少し忘れていたので表にしときます。

早見表

変数の種別 リファレンス デリファレンス
スカラー \$sc $$ref_sc
リスト(配列) \@list @$ref_list
ハッシュ \%hash %$ref_hash

せっかくなんで例も

こんな感じで変数が定義されている場合。

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

なお,間違った型でデリファレンス(リストなのに%をつけたり)すると
何か例外が飛ぶのか,特に対処をしないとスクリプトの実行がそこで停止するようです。

プライバシーポリシー お問い合わせ