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.
これはリファレンスに関するあらゆる側面に関する完全な文書です。 チュートリアルに関しては perlreftut を参照してください。
説明¶
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 "Circular References" 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)にある値に対する参照カウントは、 ちょっとした手助けなしにはゼロにはなりません; 詳しくは "Circular References" を参照してください。) そのものがオブジェクトであるときには、デストラクタが動作します。 オブジェクトについてより詳しくは、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: in general, 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.
リファレンスは幾つかのやり方で構築することができます。
逆スラッシュ演算子¶
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)を使うこともできます。
大かっこ¶
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 = (\$x, \@y, \%z);
@list = \($x, @y, %z); # 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
も同様ですが、キーのコピーに対するリファレンスである点が 異なります(これはキーが完全なスカラではなく単なる文字列であるためです)。
中かっこ¶
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.
先頭にある +{
や {;
が、その式が実際にはハッシュのリファレンスなのか ブロックなのかの曖昧さを除去するためにあります。
無名サブルーチン¶
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 プログラマーがそれを使いはじめるために トラブルをしょいこんでしまうような代物ではありません。
コンストラクタ¶
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()
. You can call them indirectly:
リファレンスはコンストラクタと呼ばれる特別なサブルーチンが返すようにして いることが多くなっています。 Perlのオブジェクトは、自分がどのパッケージと関係を持っているかを 知っているものへのリファレンスでしかありません。 コンストラクタは、その関係付けをどのように行なうかを知っているという意味で、 特別なサブルーチンにすぎません。 単なるリファレンスとしてスタートし、オブジェクトといわれている間でも 通常のリファレンスであることに変わりはありません。 コンストラクタは、慣習的に new()
と名前を付けられます。 間接的に呼び出すことも 可能です:
$objref = new Doggie( Tail => 'short', Ears => 'long' );
But that can produce ambiguous syntax in certain cases, so it's often better to use the direct method invocation approach:
しかし、これは場合によってはあいまいな文法となる場合があるので、 たいていは直接メソッド起動手法を使う方がよいです:
$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)
This indirect object syntax is only available when use feature "indirect"
is in effect, and that is not the case when use v5.36
(or higher) is requested, it is best to avoid indirect object syntax entirely.
この間接オブジェクト構文は、 use feature "indirect"
が 有効の時にのみ利用可能で、 use v5.36
(またはそれ以上) を要求している場合は 含まれないので、間接オブジェクト構文を完全に避けるのが最善です。
自動有効化¶
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.
適切な型のリファレンスは、そういったリファレンスが存在するかのような文脈で デリファレンスを行うと、実際に存在するようになります。 デリファレンスについてはまだ話していないので、まだ例を示すことができません。
型グロブスロット¶
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};
$globname = *foo{NAME}; # "foo"
$pkgname = *foo{PACKAGE}; # "main"
Most of these are self-explanatory, but *foo{IO}
deserves special attention. 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 discouraged, to encourage a consistent use of one name: IO. On perls between v5.8 and v5.22, it will issue a deprecation warning, but this deprecation has since been rescinded.
これらのほとんどは自己説明的ですが、*foo{IO}
は特に注目するに値します。 これはファイルハンドル("open" in perlfunc)、ソケット("socket" in perlfunc と "socketpair" in perlfunc)、ディレクトリハンドル("opendir" in perlfunc)として 使われる IO ハンドルを返します。 過去のバージョンの Perl に対する互換性のために、 *foo{FILEHANDLE}
は *foo{IO}
の同義語ですが、 一つの名前 IO を一貫して使うために非推奨です。 v5.8 から v5.22 の間の perl では、これは廃止予定警告を出していましたが、 それ以降ではこの廃止予定は撤回されました。
*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{NAME}
and *foo{PACKAGE}
are the exception, in that they return strings, rather than references. These return the package and name of the typeglob itself, rather than one that has been assigned to it. So, after *foo=*Foo::bar
, *foo
will become "*Foo::bar" when used as a string, but *foo{PACKAGE}
and *foo{NAME}
will continue to produce "main" and "foo", respectively.
*foo{NAME}
と *foo{PACKAGE}
は例外で、リファレンスではなく文字列を 返します。 これらは、型グロブに代入されているものではなく、型グロブ自身のパッケージと 名前を返します。 従って、*foo=*Foo::bar
の痕では、*foo
は文字列として使われるときには "*Foo::bar" になりますが、*foo{PACKAGE}
と *foo{NAME}
はそれぞれ "main" と "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.
リファレンスの作り方はこれだけです。 ここまでくると、どこか参照のかなたへ行ってしまったデータを取り戻すために、 どうやってリファレンスを使うかを知りたいことでしょう。 基本的な方法がいくつかあります。
単純なスカラ¶
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;
ブロック¶
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 です。
矢印記法¶
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 では、それができます。
オブジェクト¶
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";
Similarly, an expression that returns a reference to a scalar can be dereferenced via ${...}
. Thus, the above expression may be written as:
同様に、スカラへのリファレンスを返す式は ${...}
で デリファレンスできます。 従って、上述の式は以下のように書けます:
print "That yields ${\($n + 5)} widgets\n";
循環参照¶
It is possible to create a "circular reference" in Perl, which can lead to memory leaks. A circular reference occurs when two references contain a reference to each other, like this:
Perl では「循環参照」を作ることが可能で、これはメモリリークを引き起こします。 循環参照は次のように、二つのリファレンスが対外へのリファレンスを 含んでいるときに起こります:
my $foo = {};
my $bar = { foo => $foo };
$foo->{bar} = $bar;
You can also create a circular reference with a single variable:
また、単一の変数でも循環参照を作ることができます:
my $foo;
$foo = \$foo;
In this case, the reference count for the variables will never reach 0, and the references will never be garbage-collected. This can lead to memory leaks.
この場合、この変数の参照カウントは決して 0 になることはなく、リファレンスは ガベージコレクションされることはありません。 これはメモリリークを引き起こします。
Because objects in Perl are implemented as references, it's possible to have circular references with objects as well. Imagine a TreeNode class where each node references its parent and child nodes. Any node with a parent will be part of a circular reference.
Perl のオブジェクトはリファレンスとして実装されているので、オブジェクトでも 循環参照を作ることが可能です。 それぞれのノードが親ノードと子ノードを参照している TreeNode クラスを 考えてみます。 親のあるノードは循環参照の一部となります。
You can break circular references by creating a "weak reference". A weak reference does not increment the reference count for a variable, which means that the object can go out of scope and be destroyed. You can weaken a reference with the weaken
function exported by the Scalar::Util module, or available as builtin::weaken
directly in Perl version 5.35.7 or later.
「弱い参照」を作ることで循環参照を壊すことができます。 弱い参照はは変数に対する参照カウントを増やさないので、オブジェクトは スコープ外に出て破壊できるようになります。 Scalar::Util モジュールでエクスポートされる weaken
関数、 または Perl バージョン 5.35.7 以降では直接 builtin::weaken
でリファレンスを 弱い参照にすることができます。
Here's how we can make the first example safer:
以下は最初の例をより安全にする方法です:
use Scalar::Util 'weaken';
my $foo = {};
my $bar = { foo => $foo };
$foo->{bar} = $bar;
weaken $foo->{bar};
The reference from $foo
to $bar
has been weakened. When the $bar
variable goes out of scope, it will be garbage-collected. The next time you look at the value of the $foo->{bar}
key, it will be undef
.
$foo
から $bar
へのリファレンスは弱い参照になります。 $bar
変数がスコープ外になると、ガベージコレクションされます。 次回 $foo->{bar}
キーの値を見ると、undef
になります。
This action at a distance can be confusing, so you should be careful with your use of weaken. You should weaken the reference in the variable that will go out of scope first. That way, the longer-lived variable will contain the expected reference until it goes out of scope.
この行動は離れたところから見ると混乱するかも知れないので、弱い山椒の 使用は慎重に行うべきです。 最初に スコープ外に出る変数のリファレンスを弱い参照にする必要があります。 そのように、長生きする変数は、スコープ外に出るまで想定されるリファレンスを 含んでいます。
シンボリックリファレンス¶
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()
$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() は、パッケージで「グローバルな」、パッケージ変数に 影響するものです。
あまりシンボリックではないリファレンス¶
Brackets around a symbolic reference can simply serve to isolate an identifier or variable name from the rest of an expression, just as they always have within a string. For example,
中かっこに囲まれたシンボリックリファレンスはちょうどそれが文字列の中に あるかのように、識別子や変数名を式の残りから単純に分離するという働きが できました。 例えば、
$push = "pop on ";
print "${push}over";
has always meant to print "pop on over", even though push is a reserved word. This is generalized to work the same without the enclosing double quotes, so that
とすると push が予約語であるにも関らず常に "pop on over" となります。 囲まれるダブルクォートがなくても同じように動作するように一般化されるので
print ${push} . "over";
and even
や
print ${ push } . "over";
will have the same effect. This construct is not considered to be a symbolic reference when you're using strict refs:
でさえも同じ効果となります。 この構造はあなたが 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, the same rule applies to any bareword that is used for subscripting a hash. So now, instead of writing
同様に、添え字付けのすべてが単一の語で行われているので、同じルールを ハッシュに対する添え字付けに使われる任意の裸の単語に適用します。 ですから、
$hash{ "aaa" }{ "bbb" }{ "ccc" }
you can write just
の代わりに以下のように書けて:
$hash{ 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
そして添え字が予約語であるかどうかを心配することはありません。 以下のようなことがしたいという珍しい場合には:
$hash{ shift }
you can force interpretation as a reserved word by adding anything that makes it more than a bareword:
裸の単語でないようにさせる何かを追加することで、予約語であるように 強制的に解釈させることができます:
$hash{ shift() }
$hash{ +shift }
$hash{ 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 スイッチは文字列が予約語として 解釈されたときには警告を発します。 しかし、あなたが小文字だけからなる単語を使った場合にはもはや警告されません; なぜなら文字列は事実上クォートされているからです。
擬似ハッシュ: 配列をハッシュとして使う¶
Pseudo-hashes have been removed from Perl. The 'fields' pragma remains available.
疑似ハッシュは Perl から削除されました。 'fields' プラグマはまだ利用可能です。
関数テンプレート¶
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 time--like those in the for
loop above, basically aliases to elements from the surrounding lexical scopes-- only works with anonymous subs, not with named subroutines. Generally said, named subroutines do not nest properly and should only be declared in the main package scope.
時間によって変わるようなレキシカル変数に対するアクセス -- 例えば先の例の for
ループのように、基本的に取り囲むレキシカルスコープからの 要素への別名 -- は無名サブルーチンにおいてのみ動作し、 名前付きサブルーチンでは動作しません。 一般的に言うと、名前付きサブルーチンは適切にネストすることはなく、 main パッケージスコープ内でのみ宣言されるべきです。
This is because named subroutines are created at compile time so their lexical variables get assigned to the parent lexicals from the first execution of the parent block. If a parent scope is entered a second time, its lexicals are created again, while the nested subs still reference the old ones.
これは、名前つきのサブルーチンはコンパイル時に一度だけ作成されるので、 そのレキシカル変数は、親ブロックの最初の実行時から親レキシカルに 代入されるからです。 親スコープに 2 回目に入ると、レキシカルは再作成される一方、 ネストしたサブルーチンは古いものを参照したままです。
Anonymous subroutines get to capture each time you execute the sub
operator, as they are created on the fly. 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" due to the reasons explained above. For example, this won't work:
無名サブルーチンは、'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 anonymous subroutine. But when it does, it has normal access to the lexical variable $x from the scope of outer() at the time outer is invoked.
これで、inner() は outer() の中からのみ呼び出せるようになります; なぜなら、無名サブルーチンの一時変数に対する代入があるからです。 しかしこれを行ったとき、outer() が起動するときの outer() のスコープから レキシカル変数 $x のアクセスは通常通りです。
This has the interesting effect of creating a function local to another function, something not normally supported in Perl.
これは、通常 Perl ではサポートされていないような、 ある関数にローカルな関数を生成するときの興味深い効果です。
後置デリファレンス文法¶
Beginning in v5.20.0, a postfix syntax for using references is available. It behaves as described in "Using References", but instead of a prefixed sigil, a postfixed sigil-and-star is used.
v5.20.0 から、リファレンスを使うための後置文法が利用可能になりました。 これは "Using References" で記述されているように振る舞いますが、印を 前置するのではなく、後置印とアスタリスクを使います。
For example:
たとえば:
$r = \@a;
@b = $r->@*; # equivalent to @$r or @{ $r }
$r = [ 1, [ 2, 3 ], 4 ];
$r->[1]->@*; # equivalent to @{ $r->[1] }
In Perl 5.20 and 5.22, this syntax must be enabled with use feature 'postderef'
. As of Perl 5.24, no feature declarations are required to make it available.
Perl 5.20 と 5.22 では、この文法は use feature 'postderef'
で有効にされなければなりません。 Perl 5.24 から、利用可能にするのに feature 宣言は不要になりました。
Postfix dereference should work in all circumstances where block (circumfix) dereference worked, and should be entirely equivalent. This syntax allows dereferencing to be written and read entirely left-to-right. The following equivalencies are defined:
後置デリファレンスは、ブロック(両面)デリファレンスが動作する場所ならどこでも どうさするはずです。 この文法により、完全に左から右に読み書きできるようにします。 以下の等価物が定義されています。
$sref->$*; # same as ${ $sref }
$aref->@*; # same as @{ $aref }
$aref->$#*; # same as $#{ $aref }
$href->%*; # same as %{ $href }
$cref->&*; # same as &{ $cref }
$gref->**; # same as *{ $gref }
Note especially that $cref->&*
is not equivalent to $cref->()
, and can serve different purposes.
特に、$cref->&*
は $cref->()
と等価 ではない ことに 注意してください; 異なった目的を提供します。
Glob elements can be extracted through the postfix dereferencing feature:
グロブ要素は後置デリファレンス機能を通して展開できます:
$gref->*{SCALAR}; # same as *{ $gref }{SCALAR}
Postfix array and scalar dereferencing can be used in interpolating strings (double quotes or the qq
operator), but only if the postderef_qq
feature is enabled. Interpolation of postfix array highest index access (->$#*
) is also supported when the postderef_qq
feature is enabled.
配列とスカラの後置デリファレンスを文字列展開(ダブルクォートや qq
演算子)の 中で使うことは 可能 ですが、postderef_qq
機能が有効になっている 場合のみです。 postderef_qq
機能が有効の場合、 後置配列の最大の添え字の展開 (->$#*
) も対応します。
後置リファレンススライス¶
Value slices of arrays and hashes may also be taken with postfix dereferencing notation, with the following equivalencies:
配列やハッシュの値スライスも後置デリファレンス記法をとることができ、 以下のような等価物があります:
$aref->@[ ... ]; # same as @$aref[ ... ]
$href->@{ ... }; # same as @$href{ ... }
Postfix key/value pair slicing, added in 5.20.0 and documented in the Key/Value Hash Slices section of perldata, also behaves as expected:
5.20.0 で追加され、 the Key/Value Hash Slices section of perldata に記述されている後置キー/値の組のスライスも想定通りに振る舞います:
$aref->%[ ... ]; # same as %$aref[ ... ]
$href->%{ ... }; # same as %$href{ ... }
As with postfix array, postfix value slice dereferencing can be used in interpolating strings (double quotes or the qq
operator), but only if the postderef_qq
feature is enabled.
後置配列と同様、後置値スライスデリファレンスも文字列展開(ダブルクォートや qq
演算子)の中で使うことは 可能 ですが、postderef_qq
機能が 有効になっている場合のみです。
リファレンスへの代入¶
Beginning in v5.22.0, the referencing operator can be assigned to. It performs an aliasing operation, so that the variable name referenced on the left-hand side becomes an alias for the thing referenced on the right-hand side:
v5.22.0 から、リファレンス演算子は代入できるようになります。 これは別名化操作を行い、左側で参照される変数名は右側で参照されるものへの 別名になります:
\$x = \$y; # $x and $y now point to the same scalar
\&foo = \&bar; # foo() now means bar()
\$x = \$y; # $x と $y は同じスカラを示す
\&foo = \&bar; # foo() は bar() を意味する
This syntax must be enabled with use feature 'refaliasing'
. It is experimental, and will warn by default unless no warnings 'experimental::refaliasing'
is in effect.
この文法は use feature 'refaliasing'
で有効にされなければなりません。 これは実験的であり、no warnings 'experimental::refaliasing'
が 有効でない限り、デフォルトでは警告されます。
These forms may be assigned to, and cause the right-hand side to be evaluated in scalar context:
以下の型式は代入され、右側はスカラコンテキストで評価されます:
\$scalar
\@array
\%hash
\&sub
\my $scalar
\my @array
\my %hash
\state $scalar # or @array, etc.
\our $scalar # etc.
\local $scalar # etc.
\local our $scalar # etc.
\$some_array[$index]
\$some_hash{$key}
\local $some_array[$index]
\local $some_hash{$key}
condition ? \$this : \$that[0] # etc.
Slicing operations and parentheses cause the right-hand side to be evaluated in list context:
スライス演算子とかっこは右側をリストコンテキストで評価します:
\@array[5..7]
(\@array[5..7])
\(@array[5..7])
\@hash{'foo','bar'}
(\@hash{'foo','bar'})
\(@hash{'foo','bar'})
(\$scalar)
\($scalar)
\(my $scalar)
\my($scalar)
(\@array)
(\%hash)
(\&sub)
\(&sub)
\($foo, @bar, %baz)
(\$foo, \@bar, \%baz)
Each element on the right-hand side must be a reference to a datum of the right type. Parentheses immediately surrounding an array (and possibly also my
/state
/our
/local
) will make each element of the array an alias to the corresponding scalar referenced on the right-hand side:
右側の各要素は右側の型へのリファレンスでなければなりません。 配列 (および場合によっては my
/state
/our
/local
) を直接囲むかっこは、 配列の各要素を、右側のリファレンスになる対応するスカラへの別名にします:
\(@x) = \(@y); # @x and @y now have the same elements
\my(@x) = \(@y); # likewise
\(my @x) = \(@y); # likewise
push @x, 3; # but now @x has an extra element that @y lacks
\(@x) = (\$x, \$y, \$z); # @x now contains $x, $y, and $z
Combining that form with local
and putting parentheses immediately around a hash are forbidden (because it is not clear what they should do):
この型式と local
を組み合わせるのと、ハッシュのすぐ周りにかっこを置くのは 禁止されています (これが何をしたいかがはっきりしないからです):
\local(@array) = foo(); # WRONG
\(%hash) = bar(); # WRONG
Assignment to references and non-references may be combined in lists and conditional ternary expressions, as long as the values on the right-hand side are the right type for each element on the left, though this may make for obfuscated code:
リファレンスと非リファレンスの代入は、 右側の値が左側の各要素に対して正しい型である限りにおいて、 リストの中と 3 項条件式で組み合わせられますが、 これは不明瞭なコードになります:
(my $tom, \my $dick, \my @harry) = (\1, \2, [1..3]);
# $tom is now \1
# $dick is now 2 (read-only)
# @harry is (1,2,3)
my $type = ref $thingy;
($type ? $type eq 'ARRAY' ? \@foo : \$bar : $baz) = $thingy;
A reference assignment in list context returns a list of references to each left-hand value. So for example
リストコンテキストでのリファレンスへの代入は、 それぞれの左辺値へのリファレンスのリストを返します。 なので、次の例では:
@b = ((\$l1, \$l2, \(@a)) = (\$r1, \$r2, $\r3, \$4));
is equivalent to
次と等価です:
(\$l1, \$l2, \(@a)) = (\$r1, \$r2, $\r3, \$4);
@b = (\$l1, \$l2, \$a[0], \$a[1]);
The foreach
loop can also take a reference constructor for its loop variable, though the syntax is limited to one of the following, with an optional my
, state
, or our
after the backslash:
foreach
ループは、そのループ変数にリファレンス生成子を取ることも できますが、その文法は以下のうち一つに、オプションとして逆スラッシュの後に my
, state
, our
を置く形に制限されます:
\$s
\@a
\%h
\&c
No parentheses are permitted. This feature is particularly useful for arrays-of-arrays, or arrays-of-hashes:
かっこは許されません。 この機能は、配列の配列やハッシュの配列に特に有用です:
foreach \my @a (@array_of_arrays) {
frobnicate($a[0], $a[-1]);
}
foreach \my %h (@array_of_hashes) {
$h{gelastic}++ if $h{type} eq 'funny';
}
CAVEAT: Aliasing does not work correctly with closures. If you try to alias lexical variables from an inner subroutine or eval
, the aliasing will only be visible within that inner sub, and will not affect the outer subroutine where the variables are declared. This bizarre behavior is subject to change.
警告: 別名化はクロージャでは正しく動作しません。 内側のサブルーチンは eval
からレキシカル変数への別名化をしようとすると、 別名化はその内側のサブルーチンの中でのみ見ることができ、 変数が宣言された外側のサブルーチンには影響を与えません。 このおかしな振る舞いは変更予定です。
Declaring a Reference to a Variable¶
Beginning in v5.26.0, the referencing operator can come after my
, state
, our
, or local
. This syntax must be enabled with use feature 'declared_refs'
. It is experimental, and will warn by default unless no warnings 'experimental::refaliasing'
is in effect.
Beginning in v5.26.0 から、my
, state
, our
, local
の後にリファレンス化演算子を 置けるようになりました。 この文法は、use feature 'declared_refs'
を有効にしていなければなりません。 これは実験的であり、no warnings 'experimental::refaliasing'
が 有効でない限り、デフォルトでは警告されます。
This feature makes these:
この機能は、次のものを:
my \$x;
our \$y;
equivalent to:
以下と等価にします:
\my $x;
\our $x;
It is intended mainly for use in assignments to references (see "Assigning to References", above). It also allows the backslash to be used on just some items in a list of declared variables:
これは主に、リファレンスへの代入に使われます (前述の "Assigning to References" を参照してください)。 これはまた、バックスラッシュを宣言変数のリストのアイテムのように使えます:
my ($foo, \@bar, \%baz); # equivalent to: my $foo, \my(@bar, %baz);
警告: ハッシュキーとしてリファレンスを使わないこと¶
You may not (usefully) use a reference as the key to a hash. It will be converted into a string:
リファレンスをハッシュに対するキーとして使うことは(普通は)できません。 それは文字列へ変換されてしまいます:
$x{ \$x } = $x;
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 perlootut and perlobj for how to use them to create objects.
複雑なデータ構造を生成するためのリファレンスの使い方は perldsc と perllol を参照してください; オブジェクトを生成するためのリファレンスの 使い方は perlootut, perlobj を参照してください。