Perl リファレンス

リファレンスはポインタです。Perl のリファレンスはスカラ型で、変数、配列、ハッシュ(連想配列とも呼ばれます)、さらにはサブルーチンを指すことができ、プログラムのどこでも使用できます。


リファレンスの作成

変数を定義するとき、変数名の前に \ を付けると、その変数のリファレンスが得られます。例:

$scalarref = \$foo;     # 标量变量引用
$arrayref  = \@ARGV;    # 列表的引用
$hashref   = \%ENV;     # 哈希的引用
$coderef   = \&handler; # 子过程引用
$globref   = \*foo;     # GLOB句柄引用

配列では、匿名配列リファレンスを使用できます。[] で定義します:

$aref= [ 1,"foo",undef,13 ];

匿名配列の要素はさらに匿名配列にできるので、この方法で配列の配列を構築でき、任意の次元の配列を構築できます。

my $aref = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
]

ハッシュでは、匿名ハッシュリファレンスを使用できます。{} で定義します:

$href= { APR =>4, AUG =>8 };

サブルーチン名のない匿名サブルーチンリファレンスも作成できます:

$coderef = sub { print "サンプル!\n" };

デリファレンス

デリファレンスは、型に応じて $、@ または % を使って行います。実例は次のとおりです:

例

#!/usr/bin/perl $var = 10; # $r は $var スカラへのリファレンス $r = \$var; # ローカルに保存された $r の変数値を出力 print "$varは :", $$r, "\n"; @var = (1, 2, 3); # $r は @var 配列へのリファレンス $r = \@var; # ローカルに保存された $r の変数値を出力 print "@var は:", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # $r は %var ハッシュへのリファレンス $r = \%var; # ローカルに保存された $r の変数値を出力 print "%var は :", %$r, "\n";

上記の例を実行すると、実行結果は次のようになります:

10 为 : 10
1 2 3 为: 123
\%var 为 : key110key220

変数の型が分からない場合は、refを使って判断できます。戻り値のリストは次のとおりです。以下の値がない場合は false を返します:

SCALAR
ARRAY
HASH
CODE
GLOB
REF

実例は次のとおりです:

例

#!/usr/bin/perl $var = 10; $r = \$var; print "r のリファレンス型 :", ref($r), "\n"; @var = (1, 2, 3); $r = \@var; print "r のリファレンス型 :", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var; print "r のリファレンス型 :", ref($r), "\n";

上記の例を実行すると、実行結果は次のようになります:

r 的引用类型 : SCALAR
r 的引用类型 : ARRAY
r 的引用类型 : HASH

循環参照

循環参照は、2つのリファレンスが互いに参照し合うときに発生します。メモリリークを引き起こす可能性があるため、注意深く使用する必要があります。次の実例のとおりです:

例

#!/usr/bin/perl my $foo = 100; $foo = \$foo; print "Value of foo is : ", $$foo, "\n";

上記の例を実行すると、実行結果は次のようになります:

Value of foo is : REF(0x9aae38)

関数リファレンス

関数リファレンスの形式: \&

関数リファレンスを呼び出す形式: & + 作成したリファレンス名。

実例は次のとおりです:

例

#!/usr/bin/perl # 関数定義 sub PrintHash{ my (%hash) = @_; foreach $item (%hash){ print "要素 :$item\n"; } } %hash = ('name' => 'サンプル', 'age' => 3); # 関数のリファレンスを作成 $cref = \&PrintHash; # リファレンスを使って関数を呼び出す &$cref(%hash);

上記の例を実行すると、実行結果は次のようになります:

元素 : age
元素 : 3
元素 : name
元素 : サンプル
その他の拡張