5.8.8

NAME

perlref - Perl references and nested data structures

perlref - Perlのリファレンスとネストしたデータ構造

注意

This is complete documentation about all aspects of references. For a shorter, tutorial introduction to just the essential features, see perlreftut.

本ドキュメントはリファレンスに関するものです。 チュートリアルに関しては perlrefut を参照してください。

説明

Before release 5 of Perl it was difficult to represent complex data structures, because all references had to be symbolic--and even then it was difficult to refer to a variable instead of a symbol table entry. Perl now not only makes it easier to use symbolic references to variables, but also lets you have "hard" references to any piece of data or code. Any scalar may hold a hard reference. Because arrays and hashes contain scalars, you can now easily build arrays of arrays, arrays of hashes, hashes of arrays, arrays of hashes of functions, and so on.

リリース 5 以前の Perl ではすべてのリファレンスはシンボリックでなければ ならなかったために、複雑なデータ構造を表現することが困難でした。 そしてシンボルテーブルのエントリーではなく変数を参照したいと望んだときも 困難であったのです。 Perl はシンボリックリファレンスを変数として使うことを簡単にしただけでなく、 任意のデータについて「ハード」リファレンスを持つことを可能としたのです。 任意のスカラはハードリファレンスを保持することができます。 配列とハッシュはスカラから構成されているので、あなたはいまや配列の配列、 ハッシュの配列、配列のハッシュ、関数のハッシュの配列等々を簡単に 組み立てることができるのです。

Hard references are smart--they keep track of reference counts for you, automatically freeing the thing referred to when its reference count goes to zero. (Reference counts for values in self-referential or cyclic data structures may not go to zero without a little help; see "Two-Phased Garbage Collection" in perlobj for a detailed explanation.) If that thing happens to be an object, the object is destructed. See perlobj for more about objects. (In a sense, everything in Perl is an object, but we usually reserve the word for references to objects that have been officially "blessed" into a class package.)

ハードリファレンスは賢く実際に参照されている数を管理していて、その数が 0 になれば自動的に解放を行ないます。 (自己参照や循環データ(cyclic data)にある値に対する参照カウントは、 ちょっとした手助けなしにはゼロにはなりません。 詳しくは "Two-Phased Garbage Collection" in perlobj を参照してください。) そのものがオブジェクトであるときには、デストラクタが動作します。 オブジェクトについてより詳しくは、perlobj を参照してください。 (ある意味では、Perl のすべてがオブジェクトですが、通常、 クラスパッケージ内で公に "bless" されているものへのリファレンスに対して、 この用語を用います。)

Symbolic references are names of variables or other objects, just as a symbolic link in a Unix filesystem contains merely the name of a file. The *glob notation is something of a symbolic reference. (Symbolic references are sometimes called "soft references", but please don't call them that; references are confusing enough without useless synonyms.)

UNIX ファイルシステム上でのシンボリックリンクが単にファイルの名前を 持っているだけであるのと同様に、シンボリックリファレンスは変数の 名前を保持します。 *glob の記法は、シンボリックリファレンスの一種です (シンボリックリファレンスは時折“ソフトリファレンス”と 呼ばれますが、そういう呼びかたをしないでください。 リファレンスは同義語を使わないでいてさえ混乱を招くのですから)。

In contrast, hard references are more like hard links in a Unix file system: They are used to access an underlying object without concern for what its (other) name is. When the word "reference" is used without an adjective, as in the following paragraph, it is usually talking about a hard reference.

対照的に、 ハードリファレンスはUNIXのファイルシステム上のハードリンクに 似ています。 ハードリンクはそれがなんの名前であるのかを気にせずに 基礎をなすオブジェクトにアクセスするために使われます。 以下の節にあるように“リファレンス”と言う言葉を形容なしに使った 場合、通常はハードリファレンスのことを指します。

References are easy to use in Perl. There is just one overriding principle: Perl does no implicit referencing or dereferencing. When a scalar is holding a reference, it always behaves as a simple scalar. It doesn't magically start being an array or hash or subroutine; you have to tell it explicitly to do so, by dereferencing it.

Perlでリファレンスを使うのは非常に簡単です。 原則のオーバーライドが一つあるだけです。 Perl はリファレンス(referencing)やデリファレンス(defreferencing)を 暗黙に行うことはありません。 スカラがリファレンスを保持しているとき、それは常に単純なスカラとして 振る舞います。 勝手に配列や、ハッシュ、サブルーチンとして振る舞うようなことはありません。 デリファレンスをすることによって、自分で明示的に Perl に 教える必要があります。

リファレンスを作る

References can be created in several ways.

リファレンスは幾つかのやり方で構築することができます。

1.

By using the backslash operator on a variable, subroutine, or value. (This works much like the & (address-of) operator in C.) This typically creates another reference to a variable, because there's already a reference to the variable in the symbol table. But the symbol table reference might go away, and you'll still have the reference that the backslash returned. Here are some examples:

変数、サブルーチン、値にバックスラッシュ演算子を使うことによる (これは C での & (アドレス) 演算子に似た働きをします)。 既にシンボルテーブルには変数へのリファレンスが存在していますから、 この方法は 別の リファレンスを作るものです。 しかし、シンボルテーブルのリファレンスがなくなったとしても、 バックスラッシュが返したリファレンスが存在することになります。 例をいくつかあげます:

    $scalarref = \$foo;
    $arrayref  = \@ARGV;
    $hashref   = \%ENV;
    $coderef   = \&handler;
    $globref   = \*foo;

It isn't possible to create a true reference to an IO handle (filehandle or dirhandle) using the backslash operator. The most you can get is a reference to a typeglob, which is actually a complete symbol table entry. But see the explanation of the *foo{THING} syntax below. However, you can still use type globs and globrefs as though they were IO handles.

バックスラッシュ演算子を使って IO ハンドル(ファイルハンドルまたは ディレクトリハンドル)へのリファレンスを生成することはできません。 もっとも良く扱うリファレンスは型グロブに対するリファレンス(実際には シンボルテーブルのエントリである)でしょう。 後述する *foo{THING} 構文の説明を参照してください。 しかしながら、IO ハンドルであったものとして型グロブや型グロブの リファレンス(grobref)を使うこともできます。

2.

A reference to an anonymous array can be created using square brackets:

名前の無い配列へのリファレンスは、大かっこを使って作ることができます:

    $arrayref = [1, 2, ['a', 'b', 'c']];

Here we've created a reference to an anonymous array of three elements whose final element is itself a reference to another anonymous array of three elements. (The multidimensional syntax described later can be used to access this. For example, after the above, $arrayref->[2][1] would have the value "b".)

ここでは、『「名前の無い 3 個の要素を持つ配列」を最後の要素として持つ 3 個要素の名前の無い配列』へのリファレンスを作っています。 (あとで述べる多次元構文を使って、これをアクセスすることができます。 たとえば、上記のようにした後では、 $arrayref->[2][1] が "b" となります。)

Taking a reference to an enumerated list is not the same as using square brackets--instead it's the same as creating a list of references!

列挙リストに対するリファレンスを取るということは、大かっこを使うことと 同じではありません。 これはリファレンスのリストを生成することと同じなのです!

    @list = (\$a, \@b, \%c);
    @list = \($a, @b, %c);      # same thing!

As a special case, \(@foo) returns a list of references to the contents of @foo, not a reference to @foo itself. Likewise for %foo, except that the key references are to copies (since the keys are just strings rather than full-fledged scalars).

特殊な場合として、\(@foo)@foo の内容へのリファレンスのリストを返し、 @foo 自身へのリファレンスは返しません。 これは %foo と似ていますが、キーのリファレンスがコピーに対するもので ある点が異なります(これはキーが完全なスカラではなく 単なる文字列であるためです)。

3.

A reference to an anonymous hash can be created using curly brackets:

名前の無いハッシュへのリファレンスは、中かっこを使って作ることができます:

    $hashref = {
        'Adam'  => 'Eve',
        'Clyde' => 'Bonnie',
    };

Anonymous hash and array composers like these can be intermixed freely to produce as complicated a structure as you want. The multidimensional syntax described below works for these too. The values above are literals, but variables and expressions would work just as well, because assignment operators in Perl (even within local() or my()) are executable statements, not compile-time declarations.

無名ハッシュと配列のコンストラクタは、複雑な構造を作るために自由に 組み合わせることができます。 後述する多次元構文は、そのようなものに対しても使うことができます。 上記の値はリテラルですが、変数や式であってもかまいません。 Perl での代入演算は、(たとえ、local() や my() の中でも) コンパイル時の 宣言文ではなく、実行文だからです。

Because curly brackets (braces) are used for several other things including BLOCKs, you may occasionally have to disambiguate braces at the beginning of a statement by putting a + or a return in front so that Perl realizes the opening brace isn't starting a BLOCK. The economy and mnemonic value of using curlies is deemed worth this occasional extra hassle.

中かっこは、BLOCK を始めとして他のことにも使われますから、 開きの中かっこが BLOCK の開始でないことを Perl に教える ために文の最初の中かっこの前に +return をつけて、 曖昧さをなくすようにする必要がある場合があります。 このちょっとした余分な作業は、中かっこの使用に関連して 実際に使ってみる価値や覚えておくだけの価値があるでしょう。

For example, if you wanted a function to make a new hash and return a reference to it, you have these options:

たとえば、新しいハッシュを作って、それへのリファレンスを返す関数が欲しければ、 以下のような選択肢があります:

    sub hashem {        { @_ } }   # silently wrong
    sub hashem {       +{ @_ } }   # ok
    sub hashem { return { @_ } }   # ok

On the other hand, if you want the other meaning, you can do this:

その一方で、以下のようにすることもできます:

    sub showem {        { @_ } }   # ambiguous (currently ok, but may change)
    sub showem {       {; @_ } }   # ok
    sub showem { { return @_ } }   # ok

The leading +{ and {; always serve to disambiguate the expression to mean either the HASH reference, or the BLOCK.

先頭にある +{{; が、その式が実際には ハッシュのリファレンスなのかブロックなのかの 曖昧さを除去するためにあります。

4.

A reference to an anonymous subroutine can be created by using sub without a subname:

無名サブルーチンのへのリファレンスは、サブルーチン名の無い sub を使って 作ることができます:

    $coderef = sub { print "Boink!\n" };

Note the semicolon. Except for the code inside not being immediately executed, a sub {} is not so much a declaration as it is an operator, like do{} or eval{}. (However, no matter how many times you execute that particular line (unless you're in an eval("...")), $coderef will still have a reference to the same anonymous subroutine.)

セミコロンに注意してください。 内部のコードが即座に実行されるのではないということを除けば、sub{} は、 宣言というよりもむしろ、do{}eval{} のような演算子です(しかし、 eval("...") の中でなければ、何回その行を実行しようとも $coderef は、同一の 無名サブルーチンをリファレンスすることになります)。

Anonymous subroutines act as closures with respect to my() variables, that is, variables lexically visible within the current scope. Closure is a notion out of the Lisp world that says if you define an anonymous function in a particular lexical context, it pretends to run in that context even when it's called outside the context.

無名サブルーチンは my() 変数に関連するクロージャのように振る舞います。 つまり、変数はカレントのスコープの中においてレキシカルに見えます。 クロージャは、無名関数をある特定のレキシカルコンテキストで 定義した場合にたとえそのコンテキストの外側で呼び出されたとしても 定義されたときのコンテキストで実行されることを要求するという Lisp の世界の概念です。

In human terms, it's a funny way of passing arguments to a subroutine when you define it as well as when you call it. It's useful for setting up little bits of code to run later, such as callbacks. You can even do object-oriented stuff with it, though Perl already provides a different mechanism to do that--see perlobj.

わかりやすく言えば、あなたがサブルーチンを呼び出すときと同じように、 サブルーチンを定義するときに引数を渡すという奇妙なやり方ということです。 あなたはこれでオブジェクト指向的性質を実現することも できます。 が、Perl はすでにこれとは異なる仕組みを提供しています -- perlobj を参照してください。

You might also think of closure as a way to write a subroutine template without using eval(). Here's a small example of how closures work:

クロージャは eval なしにサブルーチンのテンプレートを記述する方法だという 考え方もできます。 以下に示すのは、クロージャがどのように動作するのかの例です。

    sub newprint {
        my $x = shift;
        return sub { my $y = shift; print "$x, $y!\n"; };
    }
    $h = newprint("Howdy");
    $g = newprint("Greetings");

    # Time passes...

    &$h("world");
    &$g("earthlings");

This prints

出力はこうなります。

    Howdy, world!
    Greetings, earthlings!

Note particularly that $x continues to refer to the value passed into newprint() despite "my $x" having gone out of scope by the time the anonymous subroutine runs. That's what a closure is all about.

ここで特に、無名サブルーチンの実行時には“my $x”がスコープの外にあるにも かかわらず、$x が newprint() に渡された値を参照しつづけていることに 注意してください。 これがクロージャがクロージャたる由縁です。

This applies only to lexical variables, by the way. Dynamic variables continue to work as they have always worked. Closure is not something that most Perl programmers need trouble themselves about to begin with.

これはレキシカル変数にのみ適用されます。 動的変数はこれまでと同じように動作します。 クロージャは、大部分の Perl プログラマーがそれを使いはじめるために トラブルをしょいこんでしまうような代物ではありません。

5.

References are often returned by special subroutines called constructors. Perl objects are just references to a special type of object that happens to know which package it's associated with. Constructors are just special subroutines that know how to create that association. They do so by starting with an ordinary reference, and it remains an ordinary reference even while it's also being an object. Constructors are often named new() and called indirectly:

リファレンスはコンストラクタと呼ばれる特別なサブルーチンが返すようにして いることが多くなっています。 Perlのオブジェクトは、自分がどのパッケージと関係を持っているかを 知っているものへのリファレンスでしかありません。 コンストラクタは、その関係付けをどのように行なうかを知っているという意味で、 特別なサブルーチンにすぎません。 単なるリファレンスとしてスタートし、オブジェクトといわれている間でも 通常のリファレンスであることに変わりはありません。 コンストラクタは、慣習的に new() と名前を付けられ、間接的に呼び出されます:

    $objref = new Doggie (Tail => 'short', Ears => 'long');

But don't have to be:

以下のようにしてもかまいません。

    $objref   = Doggie->new(Tail => 'short', Ears => 'long');

    use Term::Cap;
    $terminal = Term::Cap->Tgetent( { OSPEED => 9600 });

    use Tk;
    $main    = MainWindow->new();
    $menubar = $main->Frame(-relief              => "raised",
                            -borderwidth         => 2)
6.

References of the appropriate type can spring into existence if you dereference them in a context that assumes they exist. Because we haven't talked about dereferencing yet, we can't show you any examples yet.

適切な型のリファレンスはそういったリファレンスが存在するかのような文脈で行うと、 実際に存在するようになります。 デリファレンスについてはまだ話していないので、まだ例を示すことができません。

7.

A reference can be created by using a special syntax, lovingly known as the *foo{THING} syntax. *foo{THING} returns a reference to the THING slot in *foo (which is the symbol table entry which holds everything known as foo).

リファレンスは、*foo{THING} 構文として知られている 特殊な構文を使って生成することができます。 *foo{THING} はリファレンスを *foo の THING スロット(これは foo として知られる全てのものを保持するシンボルテーブルのエントリです)に 返します。

    $scalarref = *foo{SCALAR};
    $arrayref  = *ARGV{ARRAY};
    $hashref   = *ENV{HASH};
    $coderef   = *handler{CODE};
    $ioref     = *STDIN{IO};
    $globref   = *foo{GLOB};
    $formatref = *foo{FORMAT};

All of these are self-explanatory except for *foo{IO}. It returns the IO handle, used for file handles ("open" in perlfunc), sockets ("socket" in perlfunc and "socketpair" in perlfunc), and directory handles ("opendir" in perlfunc). For compatibility with previous versions of Perl, *foo{FILEHANDLE} is a synonym for *foo{IO}, though it is deprecated as of 5.8.0. If deprecation warnings are in effect, it will warn of its use.

これら全ては *foo{IO} を除き、自己説明的です。 ファイルハンドル("open" in perlfunc)、ソケット("socket" in perlfunc"socketpair" in perlfunc)、ディレクトリハンドル("opendir" in perlfunc) として使われる IO ハンドルを返します。 過去のバージョンの Perl に対する互換性のために、 *foo{FILEHANDLE}*foo{IO} の同義語ですが、5.8.0 からは 非推奨です。 警告が有効になっていれば、非推奨警告が出ます。

*foo{THING} returns undef if that particular THING hasn't been used yet, except in the case of scalars. *foo{SCALAR} returns a reference to an anonymous scalar if $foo hasn't been used yet. This might change in a future release.

*foo{THING} は、スカラの場合を除いた特定の THING がまだ使われてい ない場合には undef を返します。 *foo{SCALAR} は $foo がまだ使われていなかった場合には 無名スカラへのリファレンスを返します。 これは将来のリリースでは変わる可能性があります。

*foo{IO} is an alternative to the *HANDLE mechanism given in "Typeglobs and Filehandles" in perldata for passing filehandles into or out of subroutines, or storing into larger data structures. Its disadvantage is that it won't create a new filehandle for you. Its advantage is that you have less risk of clobbering more than you want to with a typeglob assignment. (It still conflates file and directory handles, though.) However, if you assign the incoming value to a scalar instead of a typeglob as we do in the examples below, there's no risk of that happening.

*foo{IO} は、"Typeglobs and Filehandles" in perldata にある ファイルハンドルをサブルーチンに渡したり、あるいは逆に サブルーチンから返すために、あるいは大きなデータ構造を格納する ために用いられる *HANDLE 機構の代替です。 その不利な点は新しいハンドルをあなたのために作り出すことはしないと いうことです。 有利な点は、型グロブの代入を使うよりも気をつかう必要があまりないということです。 (しかし、これはまだファイルハンドルとディレクトリハンドルを融合します。) しかし、もし以下の例で行っているように、値を型グロブではなくスカラに 代入すると、起きることに対するリスクはありません。

    splutter(*STDOUT);          # pass the whole glob
    splutter(*STDOUT{IO});      # pass both file and dir handles

    sub splutter {
        my $fh = shift;
        print $fh "her um well a hmmm\n";
    }

    $rec = get_rec(*STDIN);     # pass the whole glob
    $rec = get_rec(*STDIN{IO}); # pass both file and dir handles

    sub get_rec {
        my $fh = shift;
        return scalar <$fh>;
    }

リファレンスを使う

That's it for creating references. By now you're probably dying to know how to use references to get back to your long-lost data. There are several basic methods.

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

  1. Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a simple scalar variable containing a reference of the correct type:

    変数名やサブルーチン名の一部として識別子を置くところでは、適切な 型のリファレンスを持った単純スカラ変数でその識別子を 置き換えることができます:

        $bar = $$scalarref;
        push(@$arrayref, $filename);
        $$arrayref[0] = "January";
        $$hashref{"KEY"} = "VALUE";
        &$coderef(1,2,3);
        print $globref "output\n";

    It's important to understand that we are specifically not dereferencing $arrayref[0] or $hashref{"KEY"} there. The dereference of the scalar variable happens before it does any key lookups. Anything more complicated than a simple scalar variable must use methods 2 or 3 below. However, a "simple scalar" includes an identifier that itself uses method 1 recursively. Therefore, the following prints "howdy".

    $arrayref[0] や $hashref{"KEY"} という形でしているの ではない ことが 大切です。 スカラ変数のデリファレンスは、いかなる key の検索よりも 前に 行なわれます。 単純スカラ変数より込み入ったものはすべて、 以下の 2 番か 3 番の方法が採られます。 しかしながら、「単純スカラ」には、この 1 番目の方法を再帰的に使っている 識別子も含まれます。 したがって、以下はは、"howdy" と出力します。

        $refrefref = \\\"howdy";
        print $$$$refrefref;
  2. 2.

    Anywhere you'd put an identifier (or chain of identifiers) as part of a variable or subroutine name, you can replace the identifier with a BLOCK returning a reference of the correct type. In other words, the previous examples could be written like this:

    変数名やサブルーチン名の一部として識別子を置くところでは、適切な型の リファレンスを返す BLOCK を伴う識別子で置き換えることができます。 言い換えると、先の例は以下のように書くことができます:

        $bar = ${$scalarref};
        push(@{$arrayref}, $filename);
        ${$arrayref}[0] = "January";
        ${$hashref}{"KEY"} = "VALUE";
        &{$coderef}(1,2,3);
        $globref->print("output\n");  # iff IO::Handle is loaded

    Admittedly, it's a little silly to use the curlies in this case, but the BLOCK can contain any arbitrary expression, in particular, subscripted expressions:

    確かにこの場合には中かっこを付けるのはばかげたことかもしれませんが、 BLOCK には任意の式、特に添字を付けた式を入れることができます:

        &{ $dispatch{$index} }(1,2,3);      # call correct routine

    Because of being able to omit the curlies for the simple case of $$x, people often make the mistake of viewing the dereferencing symbols as proper operators, and wonder about their precedence. If they were, though, you could use parentheses instead of braces. That's not the case. Consider the difference below; case 0 is a short-hand version of case 1, not case 2:

    単純な <$$x> の場合には中かっこが省略できるので、シンボルの デリファレンスを適当な演算子のように受け取って、その優先順位はどのくらいかと 悩む人があります。 しかし、もし演算子であれば、中かっこの代わりに、 普通の括弧が使えることでしょう。 そうではありません。 以下の違いを考えてみてください。 CASE 0 は、CASE 1 を短くしたものであり、CASE 2 を 短くしたものでは ありません:

        $$hashref{"KEY"}   = "VALUE";       # CASE 0
        ${$hashref}{"KEY"} = "VALUE";       # CASE 1
        ${$hashref{"KEY"}} = "VALUE";       # CASE 2
        ${$hashref->{"KEY"}} = "VALUE";     # CASE 3

    Case 2 is also deceptive in that you're accessing a variable called %hashref, not dereferencing through $hashref to the hash it's presumably referencing. That would be case 3.

    CASE 2 もまた間違えやすいもので、%hashref という変数をアクセスするものです。 $hashref を仲介して、それが指すことになっているハッシュを デリファレンスしているものではありません。 それは、CASE 3 です。

  3. 3.

    Subroutine calls and lookups of individual array elements arise often enough that it gets cumbersome to use method 2. As a form of syntactic sugar, the examples for method 2 may be written:

    配列の個々の要素を使う場合が増えると、2 番の方法を使うのが 煩わしくなってきます。 構文上の打開策として上記の 2 行は、以下のように書けます:

        $arrayref->[0] = "January";   # Array element
        $hashref->{"KEY"} = "VALUE";  # Hash element
        $coderef->(1,2,3);            # Subroutine call

    The left side of the arrow can be any expression returning a reference, including a previous dereference. Note that $array[$x] is not the same thing as $array->[$x] here:

    矢印の左側には先行するデリファレンスを含めて、リファレンスを返す任意の式が 書けます($array[$x] は、$array->[$x] と同じでは ありません)。

        $array[$x]->{"foo"}->[0] = "January";

    This is one of the cases we mentioned earlier in which references could spring into existence when in an lvalue context. Before this statement, $array[$x] may have been undefined. If so, it's automatically defined with a hash reference so that we can look up {"foo"} in it. Likewise $array[$x]->{"foo"} will automatically get defined with an array reference so that we can look up [0] in it. This process is called autovivification.

    これが、先の左辺値コンテキストで用いるとリファレンスが 存在するようになるというケースの一つです。 この文以前には、$array[$x] は未定義かもしれません。 その場合自動的にハッシュリファレンスと定義されて、{"foo"} が 検索できるようになります。 同じように $array[$x]->{"foo"} が配列リファレンスで定義されるので、 [0] をそこで探すことができます。 このプロセスは 自動有効化 (autovivification) と呼ばれます。

    One more thing here. The arrow is optional between brackets subscripts, so you can shrink the above down to

    もう一つ。矢印は、括弧付きの添字の では、省略することができますので、 上の例は、以下のように書けます:

        $array[$x]{"foo"}[0] = "January";

    Which, in the degenerate case of using only ordinary arrays, gives you multidimensional arrays just like C's:

    通常の配列だけを使うように限定すれば、ちょうど C の多次元配列のように 使うことができます:

        $score[$x][$y][$z] += 42;

    Well, okay, not entirely like C's arrays, actually. C doesn't know how to grow its arrays on demand. Perl does.

    ああ、そうだ、実際には全く C の配列と同じという訳ではありません。 C では、必要に応じて配列を大きくするなどということはできません。 Perl では、それができます。

  4. 4.

    If a reference happens to be a reference to an object, then there are probably methods to access the things referred to, and you should probably stick to those methods unless you're in the class package that defines the object's methods. In other words, be nice, and don't violate the object's encapsulation without a very good reason. Perl does not enforce encapsulation. We are not totalitarians here. We do expect some basic civility though.

    リファレンスが、オブジェクトに対するものである場合には、参照されるものを アクセスするためのメソッドがあるはずで、オブジェクトのメソッドを 定義するクラスパッケージ内でなければ、そのメソッドを使うように した方が良いでしょう。 言い換えると、良識をもって、特別正当な理由がない限り、 オブジェクトのカプセル化を反古にしてはいけないということです。 Perl は、カプセル化を強要したりはしません。 私達は、全体主義者ではありません。 ただ、なにがしかの基本的な節度を期待しています。

Using a string or number as a reference produces a symbolic reference, as explained above. Using a reference as a number produces an integer representing its storage location in memory. The only useful thing to be done with this is to compare two references numerically to see whether they refer to the same location.

文字列や数値をリファレンスとして使うと、上述したようにシンボリック リファレンスを生成します。 リファレンスを数値として使うと、メモリ内のストレージの位置の 整数表現を生成します。 これを利用して便利な唯一の状況は、二つのリファレンスを数値として 比較することで、同じ場所を参照しているかどうかを調べる場合です。

    if ($ref1 == $ref2) {  # cheap numeric compare of references
        print "refs 1 and 2 refer to the same thing\n";
    }

Using a reference as a string produces both its referent's type, including any package blessing as described in perlobj, as well as the numeric address expressed in hex. The ref() operator returns just the type of thing the reference is pointing to, without the address. See "ref" in perlfunc for details and examples of its use.

リファレンスを文字列として使うと、参照しているものの型 (perlobj で記述しているように、bless しているパッケージを含みます)と、 16 進数で表現された数値アドレスの両方を生成します。 ref() 演算子は、アドレス抜きで、リファレンスが示しているものの型だけを 返します。 この使い方の詳細と例については "ref" in perlfunc を参照してください。

The bless() operator may be used to associate the object a reference points to with a package functioning as an object class. See perlobj.

bless() 演算子は、オブジェクトをオブジェクトクラスとして機能する パッケージと結び付けるために使うことができます。 perlobj を参照してください。

A typeglob may be dereferenced the same way a reference can, because the dereference syntax always indicates the type of reference desired. So ${*foo} and ${\$foo} both indicate the same scalar variable.

デリファレンスの構文では常に目的とするリファレンスの型を 示すことができますので、型グロブをリファレンスと同じように デリファレンスすることができます。 つまり、${*foo}${\$foo} は、どちらも同じスカラ変数を 示すことになります。

Here's a trick for interpolating a subroutine call into a string:

次の例に示すのは、文字列にサブルーチン呼び出しを埋め込む仕掛けです:

    print "My sub returned @{[mysub(1,2,3)]} that time.\n";

The way it works is that when the @{...} is seen in the double-quoted string, it's evaluated as a block. The block creates a reference to an anonymous array containing the results of the call to mysub(1,2,3). So the whole block returns a reference to an array, which is then dereferenced by @{...} and stuck into the double-quoted string. This chicanery is also useful for arbitrary expressions:

ダブルクォートで囲まれた文字列中に @{...} が見つかると、その 文字列はブロックとして評価されます。 ブロックでは、mysub(1,2,3) の呼び出しを実行し、その結果に対する 無名配列へのリファレンスが作られます。 つまり、ブロック全体では、配列へのリファレンスを返すこととなり、 @{...} でデリファレンスされた後、ダブルクォートで囲まれた文字列の中に、 埋め込まれることになります。 このごまかしははっきりしない式にも有用です:

    print "That yields @{[$n + 5]} widgets\n";

シンボリックリファレンス

We said that references spring into existence as necessary if they are undefined, but we didn't say what happens if a value used as a reference is already defined, but isn't a hard reference. If you use it as a reference, it'll be treated as a symbolic reference. That is, the value of the scalar is taken to be the name of a variable, rather than a direct link to a (possibly) anonymous value.

リファレンスはもし未定義であれば必要に応じて存在するようになると言いましたが、 もしリファレンスとして使われた値が既に定義されていたときにはどのように なるのか示していませんでした。 これはハードリファレンスでは ありません。 リファレンスとして使ったならそれはシンボリックリファレンスとして扱われます。 つまり、スカラの値は(おそらく)無名の値への直接のリンクではなく、 変数の 名前 として扱われます。

People frequently expect it to work like this. So it does.

そのように働くと思われていることが多いものです。 ですからそう動作するのです。

    $name = "foo";
    $$name = 1;                 # Sets $foo
    ${$name} = 2;               # Sets $foo
    ${$name x 2} = 3;           # Sets $foofoo
    $name->[0] = 4;             # Sets $foo[0]
    @$name = ();                # Clears @foo
    &$name();                   # Calls &foo() (as in Perl 4)
    $pack = "THAT";
    ${"${pack}::$name"} = 5;    # Sets $THAT::foo without eval

This is powerful, and slightly dangerous, in that it's possible to intend (with the utmost sincerity) to use a hard reference, and accidentally use a symbolic reference instead. To protect against that, you can say

これは強力で、かつ多少危険でもあります。 (最大限の注意をはらって) ハードリファレンスを使おうとした場合にも、 誤ってシンボリックリファレンスを使ってしまうような場合があるからです。 これを防止するには、

    use strict 'refs';

and then only hard references will be allowed for the rest of the enclosing block. An inner block may countermand that with

と書いて、囲っているブロック内の残りの部分ではハードリファレンスのみが 許されるようにすることができます。 内側のブロックでは、以下のように書いて打ち消すこともできます:

    no strict 'refs';

Only package variables (globals, even if localized) are visible to symbolic references. Lexical variables (declared with my()) aren't in a symbol table, and thus are invisible to this mechanism. For example:

シンボリックリファレンスでは、パッケージ変数(局所化されていたとしても グローバル)だけを見ることができます。 (my() で宣言した) 静的なローカル変数は、シンボルテーブルに 存在しないのでシンボリックリファレンスでは参照することができません。 たとえば:

    local $value = 10;
    $ref = "value";
    {
        my $value = 20;
        print $$ref;
    }

This will still print 10, not 20. Remember that local() affects package variables, which are all "global" to the package.

これは、20 ではなく、10 と出力します。 local() は、パッケージで「グローバルな」、パッケージ変数に 影響するものです。

あまりシンボリックではないリファレンス

A new feature contributing to readability in perl version 5.001 is that the brackets around a symbolic reference behave more like quotes, just as they always have within a string. That is,

perl のバージョン 5.001 で、中かっこに囲まれたシンボリックリファレンスが よりクォートのように、ちょうどそれが文字列の中にあるかのように 振る舞うという新たな機能が読みやすさのために追加されました。

    $push = "pop on ";
    print "${push}over";

has always meant to print "pop on over", even though push is a reserved word. This has been generalized to work the same outside of quotes, so that

これは push が予約語であるにも関らず常に“pop on over”となります。 これはクォートの外であっても同様です。 ですから、

    print ${push} . "over";

and even

    print ${ push } . "over";

will have the same effect. (This would have been a syntax error in Perl 5.000, though Perl 4 allowed it in the spaceless form.) This construct is not considered to be a symbolic reference when you're using strict refs:

でさえも同じ効果となります。 (これは Perl 4 が 空白無しの形式を許しているにも関らず、 Perl 5.000 では構文エラーとなります)。 この構造はあなたが strict refs を使っているときに、 シンボリックリファレンスであることを考慮 していません

    use strict 'refs';
    ${ bareword };      # Okay, means $bareword.
    ${ "bareword" };    # Error, symbolic reference.

Similarly, because of all the subscripting that is done using single words, we've applied the same rule to any bareword that is used for subscripting a hash. So now, instead of writing

同様に添え字付けのすべてが単一の語で行われているので、 同じルールをハッシュに対する添え字付けに使われる 任意の裸の単語に適用します。 ですから、

    $array{ "aaa" }{ "bbb" }{ "ccc" }

you can write just

の代わりに以下のように書けて:

    $array{ aaa }{ bbb }{ ccc }

and not worry about whether the subscripts are reserved words. In the rare event that you do wish to do something like

そして添え字が予約語であるかどうかを心配することはありません。 以下のようなことがしたいという珍しい場合には:

    $array{ shift }

you can force interpretation as a reserved word by adding anything that makes it more than a bareword:

裸の単語でないようにさせる何かを追加することで予約語であるように 強制的に解釈させることができます。

    $array{ shift() }
    $array{ +shift }
    $array{ shift @_ }

The use warnings pragma or the -w switch will warn you if it interprets a reserved word as a string. But it will no longer warn you about using lowercase words, because the string is effectively quoted.

use warnings プラグマや -w スイッチは文字列が予約語として 解釈されたときには警告を発します。 しかし、あなたが小文字だけからなる単語を使った場合にはもはや警告されません。 なぜなら文字列は事実上クォートされているからです。

擬似ハッシュ: 配列をハッシュとして使う

WARNING: This section describes an experimental feature. Details may change without notice in future versions.

警告: このセクションは実験的機能を説明しています。 将来のバージョンにおいて、細かな点は予告なしに変更される可能性があります。

NOTE: The current user-visible implementation of pseudo-hashes (the weird use of the first array element) is deprecated starting from Perl 5.8.0 and will be removed in Perl 5.10.0, and the feature will be implemented differently. Not only is the current interface rather ugly, but the current implementation slows down normal array and hash use quite noticeably. The 'fields' pragma interface will remain available.

注意: 現在のユーザー見える形の擬似ハッシュの実装(配列の最初の要素を 奇妙な形で使うもの)は Perl 5.8.0 から非推奨となりました; Perl 5.10.0 からは 取り除かれて、この機能は別の方法で実装される予定です。 現在のインターフェースは醜いだけでなく、現在の実装は通常の配列とハッシュの 利用をかなり目立つ形で遅くしています。 "fields" プラグマインターフェースは利用可能なまま残ります。

Beginning with release 5.005 of Perl, you may use an array reference in some contexts that would normally require a hash reference. This allows you to access array elements using symbolic names, as if they were fields in a structure.

5.005 のリリースから、通常ハッシュリファレンスが要求されるような コンテキストの一部において配列リファレンスが使えるようになりました。 これはそれが構造体のフィールドであるかのごとく シンボル名を使った配列要素のアクセスを可能にします。

For this to work, the array must contain extra information. The first element of the array has to be a hash reference that maps field names to array indices. Here is an example:

これを行うためには、配列は余計な情報を持たなければなりません。 配列の最初の要素はフィールド名を配列の添え字にマッピングする ハッシュリファレンスでなければなりません。 例を挙げましょう:

    $struct = [{foo => 1, bar => 2}, "FOO", "BAR"];

    $struct->{foo};  # same as $struct->[1], i.e. "FOO"
    $struct->{bar};  # same as $struct->[2], i.e. "BAR"

    keys %$struct;   # will return ("foo", "bar") in some order
    values %$struct; # will return ("FOO", "BAR") in same some order

    while (my($k,$v) = each %$struct) {
       print "$k => $v\n";
    }

Perl will raise an exception if you try to access nonexistent fields. To avoid inconsistencies, always use the fields::phash() function provided by the fields pragma.

存在しないフィールドに対してアクセスしようとした場合、Perl は 例外を発生します。 矛盾を避けるために、fields プラグマで提供される fields::phash() 関数を 常に使ってください。

    use fields;
    $pseudohash = fields::phash(foo => "FOO", bar => "BAR");

For better performance, Perl can also do the translation from field names to array indices at compile time for typed object references. See fields.

パフォーマンスを向上させるために、Perl は型付けされた オブジェクトリファレンスのためのフィールド名から配列添え字への変換を コンパイル時に行ってしまうこともできます。 fields を参照してください。

There are two ways to check for the existence of a key in a pseudo-hash. The first is to use exists(). This checks to see if the given field has ever been set. It acts this way to match the behavior of a regular hash. For instance:

擬似ハッシュでキーの存在をチェックする方法は 2 つあります。 1 つめは exists() を使うことです。 このチェックは、指定されたフィールドに値がセットされたことがあるかどうかが わかります。 これはこの意味で通常のハッシュの振る舞いと一致します。 例えば:

    use fields;
    $phash = fields::phash([qw(foo bar pants)], ['FOO']);
    $phash->{pants} = undef;

    print exists $phash->{foo};    # true, 'foo' was set in the declaration
    print exists $phash->{bar};    # false, 'bar' has not been used.
    print exists $phash->{pants};  # true, your 'pants' have been touched

The second is to use exists() on the hash reference sitting in the first array element. This checks to see if the given key is a valid field in the pseudo-hash.

2 つめは、最初の配列要素にあるハッシュリファレンスに exists() を 使うことです。 これは、キーが擬似ハッシュの有効なフィールドであるかをチェックします。

    print exists $phash->[0]{bar};      # true, 'bar' is a valid field
    print exists $phash->[0]{shoes};# false, 'shoes' can't be used

delete() on a pseudo-hash element only deletes the value corresponding to the key, not the key itself. To delete the key, you'll have to explicitly delete it from the first hash element.

擬似ハッシュの要素に対する delete() はキーそのものではなく、キーに対応する 値だけを削除します。 キーを削除するには、最初のハッシュ要素から明示的に削除する必要があります。

    print delete $phash->{foo};     # prints $phash->[1], "FOO"
    print exists $phash->{foo};     # false
    print exists $phash->[0]{foo};  # true, key still exists
    print delete $phash->[0]{foo};  # now key is gone
    print $phash->{foo};            # runtime exception

関数テンプレート

As explained above, an anonymous function with access to the lexical variables visible when that function was compiled, creates a closure. It retains access to those variables even though it doesn't get run until later, such as in a signal handler or a Tk callback.

先に説明したように、関数がコンパイルされたときに可視なレキシカル変数に アクセスする無名関数はクロージャを作ります。 そういった変数に対するアクセスはシグナルハンドラであるとか Tk の コールバックのように、あとで実行されるときまで保持されてきた値を 取り出します。

Using a closure as a function template allows us to generate many functions that act similarly. Suppose you wanted functions named after the colors that generated HTML font changes for the various colors:

巻数テンプレートとしてクロージャを使うことによって、同じような関数を たくさん作ることが可能になります。 ここで、あなたが様々色のためにフォントを変更する HTML を生成するような 色の名前のついた関数を必要としているとしましょう:

    print "Be ", red("careful"), "with that ", green("light");

The red() and green() functions would be similar. To create these, we'll assign a closure to a typeglob of the name of the function we're trying to build.

red() と green() といった関数は似通ったものになります。 これらを作り出すために、作ろうとしている関数の名前の型グロブに クロージャを代入します。

    @colors = qw(red blue green yellow orange purple violet);
    for my $name (@colors) {
        no strict 'refs';       # allow symbol table manipulation
        *$name = *{uc $name} = sub { "<FONT COLOR='$name'>@_</FONT>" };
    } 

Now all those different functions appear to exist independently. You can call red(), RED(), blue(), BLUE(), green(), etc. This technique saves on both compile time and memory use, and is less error-prone as well, since syntax checks happen at compile time. It's critical that any variables in the anonymous subroutine be lexicals in order to create a proper closure. That's the reasons for the my on the loop iteration variable.

これで、それぞれの関数が別個に作成されます。 red(), RED(), blue(), BLUE(), green() のように呼び出すことが可能です。 このテクニックはコンパイル時間とメモリーの使用量を抑え、 同様にエラーを少なくします。 なぜなら、構文チェックはコンパイル時に行われるからです。 無名関数にある変数はすべて、適切なクロージャを作成するために重要なものです。 これはループの繰り返し変数に対する my の理由と同じです。

This is one of the only places where giving a prototype to a closure makes much sense. If you wanted to impose scalar context on the arguments of these functions (probably not a wise idea for this particular example), you could have written it this way instead:

これはクロージャにプロトタイプを与えるための場所の一つでもあります。 生成する関数の引数にスカラコンテキストを与えようとするなら (おそらくはこの例に関してはあまり賢いやり方ではないでしょう)、 以下のように記述することができます:

    *$name = sub ($) { "<FONT COLOR='$name'>$_[0]</FONT>" };

However, since prototype checking happens at compile time, the assignment above happens too late to be of much use. You could address this by putting the whole loop of assignments within a BEGIN block, forcing it to occur during compilation.

しかしながら、プロトタイプの検査はコンパイル時に行われるので、 この代入文はプロトタイプを使うには遅すぎるのです。 代入文のループ全体を BEGIN ブロックに置いてすべてを コンパイル時に行うようにすることでこれに対処することができます。

Access to lexicals that change over type--like those in the for loop above--only works with closures, not general subroutines. In the general case, then, named subroutines do not nest properly, although anonymous ones do. Thus is because named subroutines are created (and capture any outer lexicals) only once at compile time, whereas anonymous subroutines get to capture each time you execute the 'sub' operator. If you are accustomed to using nested subroutines in other programming languages with their own private variables, you'll have to work at it a bit in Perl. The intuitive coding of this type of thing incurs mysterious warnings about "will not stay shared". For example, this won't work:

型を変更するようなレキシカル変数に対するアクセス -- 例えば先の例の for ループのようなもの -- はクロージャに置いてのみ動作し、 一般的なサブルーチンでは動作しません。 一般的なケースでは、名前付きサブルーチンは適切にネストすることはなく、 (ネストするものが)無名関数であっても同じです。 これは、名前つきのサブルーチンはコンパイル時に一度だけ作成される (そして外側のレキシカルに捕捉される)のに対し、無名サブルーチンは 'sub' 演算子が実行される毎に捕捉されるからです。 他のプログラミング言語にあるような、固有のプライベート変数を持った ネストしたサブルーチンを使いたいのであれば、Perl ではちょっと 手間がかかります。 直感的にこうだと思うようなコーディングは、不可思議な警告 "will not stay shared" となるでしょう。 例を挙げると、以下の例はうまく動作しません:

    sub outer {
        my $x = $_[0] + 35;
        sub inner { return $x * 19 }   # WRONG
        return $x + inner();
    }

A work-around is the following:

以下のようにするとうまくいきます:

    sub outer {
        my $x = $_[0] + 35;
        local *inner = sub { return $x * 19 };
        return $x + inner();
    }

Now inner() can only be called from within outer(), because of the temporary assignments of the closure (anonymous subroutine). But when it does, it has normal access to the lexical variable $x from the scope of outer().

これで、inner() は outer() の中からのみ呼び出せるようになります。 なぜなら、クロージャ(無名関数)の一時変数に対する代入があるからです。 しかしこれを行ったとき、outer() のスコープからレキシカル変数 $x の アクセスは通常通りです。

This has the interesting effect of creating a function local to another function, something not normally supported in Perl.

これは、通常 Perl ではサポートされていないような ある関数にローカルな関数を生成するときの興味深い効果です。

警告

You may not (usefully) use a reference as the key to a hash. It will be converted into a string:

リファレンスをハッシュに対するキーとして使うことはできません。 それは文字列へ変換されてしまいます。

    $x{ \$a } = $a;

If you try to dereference the key, it won't do a hard dereference, and you won't accomplish what you're attempting. You might want to do something more like

キーをデリファレンスしようとするのであれば、それは ハードリファレンスには働きません。 そして、あなたがしようとしたことはできないでしょう。 次のような書き方をしたいと思うかもしれませんが、

    $r = \@a;
    $x{ $r } = $r;

And then at least you can use the values(), which will be real refs, instead of the keys(), which won't.

動作しない keys() の代わりに、少なくとも本当のリファレンスとなる values() を使うことができます。

The standard Tie::RefHash module provides a convenient workaround to this.

標準モジュール Tie::RefHash はこれを扱いやすくするための 手段を提供しています。

SEE ALSO

Besides the obvious documents, source code can be instructive. Some pathological examples of the use of references can be found in the t/op/ref.t regression test in the Perl source directory.

ドキュメントの他に、ソースコードもためになります。 幾つかのリファレンスを使っている病理学的なサンプルは Perl の ソースディレクトリにある t/op/ref.t という退行テストにあります。

See also perldsc and perllol for how to use references to create complex data structures, and perltoot, perlobj, and perlbot for how to use them to create objects.

複雑なデータ構造を生成するためのリファレンスの使い方は perldscperllol を参照してください。 オブジェクトを生成するためのリファレンスの使い方は perltootperlobjperlbot を参照してください。

POD ERRORS

Hey! The above document had some coding errors, which are explained below:

Around line 713:

Expected '=item 2'

Around line 788:

Expected '=item 3'

Around line 876:

Expected '=item 4'