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 元素 : サンプルその他の拡張