これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 15 - Twigilsの日本語訳です。
原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。
本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。
Original text: Copyright© 2008-2010 Moritz Lenz
Japanese translation: Copyright© 2011 SATOH Koichi
NAME
"Perl 5 to 6" Lesson 15 - ツイジル
SYNOPSIS
class Foo {
has $.bar;
has $!baz;
}
my @stuff = sort { $^b[1] <=> $^a[1]}, [1, 2], [0, 3], [4, 8];
my $block = { say "This is the named 'foo' parameter: $:foo" };
$block(:foo<bar>);
say "This is file $?FILE on line $?LINE"
say "A CGI script" if %*ENV.exists('DOCUMENT_ROOT');
DESCRIPTION
いくつかの変数にはツイジルという第2のシジルがあります。これは基本的にはその変数が「普通」ではないということです。違いはいくつかあり、例えばスコープの違いなどです。
オブジェクトのパブリックな属性とプライベートな属性がそれぞれ.
と!
というツイジルを持つことは既に紹介しました; それらは通常の変数ではなくself
に結びつけられています。
ツイジル^
はPerl5で例外的に扱われていたケースを一般化します。次のように書けます
# 注意: Perl5のコードです
sort { $a <=> $b } @array
$a
と$b
はstrict
プラグマに特別扱いされていました。Perl6には自己宣言された位置的パラメータというコンセプトがあり、このパラメータがツイジル^
を持ちます。
これはブロックのシグネチャリストに書かれない位置的パラメータで、辞書順(アルファベット順)に引数を割り当てられます:
my $block = { say "$^c $^a $^b" };
$block(1, 2, 3); # 3 1 2
したがってこのように書けます
@list = sort { $^b <=> $^a }, @list;
# あるいは:
@list = sort { $^foo <=> $^bar }, @list;
どこにも特別扱いはありません。
位置的引数と名前付き引数の対称性を保つため、ツイジル:
が名前付きパラメータに対して同様に働きます。
したがって次の2行はほぼ等価です:
my $block = { say $:stuff }
my $sub = sub (:$stuff) { say $stuff }
ツイジル?
は変数や定数がコンパイル時に確定できることを意味します。
例えば$?LINE
は現在の行番号(以前は__LINE__
でした)であり、$?DATA
はDATA
セクションのファイルハンドルです。
コンテキスト変数にはツイジル*
でアクセスできます。なので$*IN
や$*OUT
は動的に上書きできます。
疑似ツイジルとして<
があり、$<capture>
のように使われます。これは正規表現マッチオブジェクトにアクセスする$/<capture>
の省略記法です。
MOTIVATION
Perl5のperlvar
ドキュメントを読めば、膨大な数の変数があることが分かります。
それらの多くはグローバル変数で、プログラムに与える影響も様々です。
ツイジルはそれら特殊変数にある程度の秩序を与える試みであり、また一方で特別扱いされる部分を減らします。
オブジェクトの属性の場合はself.var
を$.var
(とか@.var
とかなんとか)と略記できるようにします。
つまるところ、悪化した「句読点ノイズ」はプログラムをよりいっそう一貫性ある、読み易いものにします。
コメント
コメントを投稿