Perl 6 の Sigil と特殊変数

はじめに

 この記事は、 Perl6 Advent Calendar 2011 (日本版)の18日目の記事です。

 以下で説明するもののうちのいくつかは、環境によってはまだ動かない(未実装)こともあります。

Perl6 の Sigil

 Perl の見た目にも表れる特徴の1つとして、 Sigil があります。Perl 6 の Sigil は、ベースは Perl と同様ですが、一部に変更があります。

Perl と同様のもの

 基本は Perl と全く同じですので、安心して書いていただけます。

スカラ変数 $
配列変数 @
ハッシュ変数 %
Perl と異なるもの

 配列とハッシュの内容へのアクセス少し変わりました。

Perl Perl6
配列の要素へのアクセス $x[n] @x[n]
ハッシュの要素へのアクセス $x{key} %x{'key'}

 ハッシュにアクセスするキーの文字列は明示的にシングルクォーテーションで囲う必要があります。 %x{'key'} は %x と書くこともできます(<>の場合シングルクォーテーションは不要です)。

twigil

 twigil は2つの記号( sigil )を用いた表記です。クラスのフィールドのアクセシビリティは twigil によって設定できます。

$!private # 2つ目がエクスクラメンションの変数はクラス内からのみアクセスできる
$.public # 2つ目がドットの変数はクラスの外からでも参照できる(入力はできない)
$.public is rw # クラスの外から入力したい場合は is で writable 指定を行う

 $^ と $: は引数として使えます。 $^ は変数名の並び順(辞書順)に、 $: は変数名指定で扱えます。

sub name {
     $:b ~ ',' ~ $:c ',' ~$:a;
}
sub dict {
     $^a ~ ',' ~ $^c ~ ',' $^:b;
}

say name(:c('az'), :b('AZ'), :a('09')); # AZ,az,09
say dict(1, 2, 3); # 1,3,2

 $? はコンパイル時に値が確定する変数です。たとえば $?FILE でファイル名が、 $?LINE で行番号が取得できます。$= は POD の内容を取得できます。

 最後に、動的かつグローバルな変数を表す twigil として $* があります。基本的なものをいくつかあげると、

@*ARGS コマンドライン引数
$*IN 標準入力
$*OUT 標準出力
$*ERR 標準エラー出力
@*INC モジュールのパス一覧

 などがあります。

特殊変数

 先にいくつか出ていますが、代表的な特殊変数について、 Perl との 違いをリストアップします。

Perl Perl6
STDIN $*IN
STDOUT $*OUT
STDERR $*ERR
$_ $_
$_[1], $_[2] ... $^a, $^b ...
$& $<>
@ARGV @*ARGS
@INC @*INC

 他にもたくさんありますので、必要に応じて Synopsis 28 をご覧ください。

余談

 先のリンク先を見てて思いましたが、コードゴルフで有効だった特殊変数のいくつかが長くなりすぎちゃって使えなくなってますね。