リファレンスを作成する方法は、いくつかあります。
$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.