リファレンスを作成する方法は、いくつかあります。
$scalarref = \$foo; $arrayref = \@ARGV $hashref = \%ENV; $coderef = \&handler;
$arrayref = [1, 2, ['a', 'b', 'c']];ここでは、『「名前の無い 3 個の要素を持つ配列」を最後の要素として持つ 3 個要素の名前の無い配列』へのリファレンスを作っています。(あとで述べる多 次元構文を使って、これをアクセスすることができます。たとえば、上記のよう にした後では、
$arrayref->[2][1] が "b" となります。)
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
名無しのハッシュと配列のコンストラクタは、複雑な構造を作るために、自由に
組み合わせることができます。後述する多次元構文は、そのようなものに対して
も使うことができます。上記の value はリテラルですが、変数や式であっても
かまいません。Perl での代入演算は、(たとえ、local() や
my() の中でも) コンパイル時の宣言文ではなく、実行文ですからです。
中括弧は、BLOCK を始め他のことにも使われますから、開き中括弧が BLOCK の
開始でないことを Perl に教えるために、文の最初の中括弧の前に + や
return をつけて、曖昧さをなくすようにする必要がある場合があります。
この時折の余分な仕事は、中括弧の使用に関する経済的、記憶的価値があると思
われます。
たとえば、新しいハッシュを作って、それへのリファレンスを返す関数が欲しけ
れば、以下のような選択肢があります:
sub hashem { { @_ } } # ちょっと間違い
sub hashem { +{ @_ } } # ok
sub hashem { return { @_ } } # ok
sub を使って作ることができます:
$coderef = sub { print "Boink!\n" };
セミコロンがあることに注意してください。内部のコードが即座に実行されるの
ではないという事実を除いて、sub{} は、宣言というよりもむしろ、
do{} や eval{} のような演算子です。(しかし、
eval("...") の中でなければ、何回その行を実行しようとも
$coderef は、同一の無名サブルーティンを参照することになります。)
こういったことを気にする方のため、現在のインプリメントでは、
local() 変数の浅い結び付きとなっています。my() 変数はアク
セスできません。これは、真のクロージャを疎外するものとなります。しかし、
(コンパイル時ではなく、) 実行時の eval() を使えば、これに対応する
ことができます:
{
my $x = time;
$coderef = eval "sub { \$x }";
}
通常は、(sub {} だけをつかったり、eval {} をも使う場合にも)
新しい sub はグローバルな `$x' をアクセスすることができるだ
けです。しかし、実行時に eval() を使っているので、呼ばれるごとに、
新しいサブルーティンリファレンスを作り出すだけではなく、グローバルな変数
の代わりに、プログラム上で自分より前に出てくる my() 変数をアクセ
スすることが許されます。一般には、アクセスされる `$x' は、新しい
sub が作られるごとに、違うものとなります。このしくみでは、変数は、
動的な深い結び付きとなります。(クロージャや、深い結び付き、浅い結び付き
というものが何かを知らなくても、あまり悩まないでください。)
new() と名前を付けますが、そ
うしなければならないものではありません:
$objref = new Doggie (Tail => 'short', Ears => 'long');
リファレンスの作り方はこれだけです。ここまでくると、どこかリファレンスの かなたへ行ってしまったデータを取り戻すために、どうやってリファレンスを使 うかを知りたいことでしょう。基本的な方法がいくつかあります。
Go to the first, previous, next, last section, table of contents.