Go to the first, previous, next, last section, table of contents.


ハードリファレンスの作成

リファレンスを作成する方法は、いくつかあります。

  1. 変数、サブルーティン、値にバックスラッシュ演算子を使うことによる。(これ は C での & (アドレス) 演算子に似た働きをします。)既にシンボルテーブルに は変数へのリファレンスが存在していますから、この方法は別のリファレンスを 作るものであることに注意してください。しかし、シンボルテーブルのリファレ ンスがなくなったとしても、バックスラッシュが返したリファレンスが存在する ことになります。例をいくつかあげます:
    $scalarref = \$foo;
    $arrayref  = \@ARGV
    $hashref   = \%ENV;
    $coderef   = \&handler;
    
  2. 名前の無い配列へのリファレンスは、大括弧を使って作ることができます:
    $arrayref = [1, 2, ['a', 'b', 'c']];
    
    ここでは、『「名前の無い 3 個の要素を持つ配列」を最後の要素として持つ 3 個要素の名前の無い配列』へのリファレンスを作っています。(あとで述べる多 次元構文を使って、これをアクセスすることができます。たとえば、上記のよう にした後では、$arrayref->[2][1] が "b" となります。)
  3. 名前の無いハッシュへのリファレンスは、中括弧を使って作ることができます:
    $hashref = {
        'Adam'  => 'Eve',
        'Clyde' => 'Bonnie',
    };
    
    名無しのハッシュと配列のコンストラクタは、複雑な構造を作るために、自由に 組み合わせることができます。後述する多次元構文は、そのようなものに対して も使うことができます。上記の value はリテラルですが、変数や式であっても かまいません。Perl での代入演算は、(たとえ、local()my() の中でも) コンパイル時の宣言文ではなく、実行文ですからです。 中括弧は、BLOCK を始め他のことにも使われますから、開き中括弧が BLOCK の 開始でないことを Perl に教えるために、文の最初の中括弧の前に +return をつけて、曖昧さをなくすようにする必要がある場合があります。 この時折の余分な仕事は、中括弧の使用に関する経済的、記憶的価値があると思 われます。 たとえば、新しいハッシュを作って、それへのリファレンスを返す関数が欲しけ れば、以下のような選択肢があります:
    sub hashem {        { @_ } }   # ちょっと間違い
    sub hashem {       +{ @_ } }   # ok
    sub hashem { return { @_ } }   # ok
    
  4. 名前の無いサブルーティンのへのリファレンスは、サブルーティン名の無い 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 が作られるごとに、違うものとなります。このしくみでは、変数は、 動的な深い結び付きとなります。(クロージャや、深い結び付き、浅い結び付き というものが何かを知らなくても、あまり悩まないでください。)
  5. リファレンスは、コンストラクタと呼ばれる特別なサブルーティンが返すように していることが多くなっています。Perlのオブジェクトは、自分がどのパッケー ジと関係を持っているかを知っているものへのリファレンスでしかありません。 コンストラクタは、その関係付けをどのように行なうかを知っているという意味 で、特別なサブルーティンにすぎません。単なるリファレンスとしてスタートし、 オブジェクトといわれている間でも通常のリファレンスであることに変わりはあ りません。コンストラクタは、慣習的に new() と名前を付けますが、そ うしなければならないものではありません:
    $objref = new Doggie (Tail => 'short', Ears => 'long');
    
  6. 適切な型のリファレンスは、そういったリファレンスが存在するかのような文脈 で被参照すると、実際に存在するようになります。被参照についてはまだ話して いないので、例を示すことができませんが。

リファレンスの作り方はこれだけです。ここまでくると、どこかリファレンスの かなたへ行ってしまったデータを取り戻すために、どうやってリファレンスを使 うかを知りたいことでしょう。基本的な方法がいくつかあります。


Go to the first, previous, next, last section, table of contents.

検索式: