Perl::リファレンス

引き続きリャマ本とアルパカ本から


#!/usr/bin/perl

use strict;
use warnings;

use 5.010;

my @one = qw(one two three);

my @two = ("hoge", \@one);

[$one[0] => one $one[1] => two $one[2] => three]
この3つの情報が入ったアドレスを@twoに渡す

@twoの一つ目は"hoge"だからそのまま表示できる


my $youki = $two[0];
print "$youki\n";

[結果]
hoge

@twoの2つめはアドレスが格納されてる


my $youki2 = $two[1];
print "$youki2\n";

[結果]
ARRAY(0xメモリアドレス)

なぜか。格納されているのはデータが置いてあるアドレス番地を指す
ポインタの情報であって、データそのものが入っているわけではないから。

ということで、持ち合わせているアドレス情報の参照先を表示させてみる。

@@hoge 配列全体
$$hoge[0] 配列の第1要素を参照


print "@$youki2\n";
print "$$youki2[0]\n";
print "$$youki2[1]\n";
print "$$youki2[2]\n";

[結果]

print "@$youki2\n";

  • > [one two three]

print "$$youki2[0]\n";

  • > [one]

print "$$youki2[1]\n";

  • > [two]

print "$$youki2[2]\n";

  • > [three]

もう1個。


my $foo = "hello";
my $bar = \$foo;
my $baz = \$bar;

pointer -> pointer $を付け足していくことでアドレスを指定し続ける


print "$foo\n";
print "$$bar\n";
print "$$$baz\n";

結果は全部「hello」。

記号ひとつで意味がだいぶ変わるから
Perl使いこなしてる本当に尊敬する。