[pod] [xml]

NAME

perlvar - Perl で定義済みの変数

DESCRIPTION

Predefined Names

(定義済みの変数)

以下の名前は Perl では特別な意味を持ちます。 記号的な名前の多くは記憶法があるか、シェルでの類推が可能です。 それでも長い名前を使用したい場合には

    use English;

とプログラムの最初に書いてください。 これは、すべての短い名前の別名として、 カレントパッケージで長い名前を付けるものです。 awk から持ってきた中間的な名前を持っているものもあります。

性能を気にしないのなら、現在選択されているファイルハンドルに 依存する変数の場合には、代わりに IO::Handle オブジェクトに 関するオブジェクトメソッドを呼び出して設定することができます。 (以下の要約では HANDLE という語を含んでいます。) まず最初に必ず、

    use IO::Handle;

と書き、その後で以下のように書くか、

    method HANDLE EXPR

もしくはより安全に以下のように書きます:

    HANDLE->method(EXPR)

それぞれのメソッドは、IO::Handle 属性の昔の値を返します。 メソッドはそれぞれ EXPR をとることができ、指定した場合には、 問題の IO::Handle 属性の新しい値を指定することになります。 指定しない場合には、多くのメソッドでは現在の値に対して何もしませんが、 autoflush() では 1 を指定されたものとします。 IO::Handle クラスを読み込むのはコストの高い操作なので、 通常の組み込み変数の使い方を覚えるべきです。

これらの変数の中には "read-only" として扱われるものもあります。 つまり、そういった変数に対して、直接にしろ、リファレンスを 介して間接にしろ、代入を行なおうとした場合には、実行時に 例外処理が起動されます。

以下のリストはまずスカラ変数、それから配列、ハッシュの順に 並んでいます。

その時点で選択されている出力チャネルの、その時点でのフォーマット名。 デフォルトでは、ファイルハンドルと同名です。 (記憶法: $^ の兄弟。)

その時点で選択されている出力チャネルの、その時点での ページ先頭フォーマット名。 デフォルトでは、ファイルハンドル名に _TOP を続けたもの。 (記憶法: ページの先頭へのポインタ。)

フォーマットの充填継続フィールド (^ で始まるもの) への 文字列で行分割を許す文字集合。 デフォルトは " \n-" で空白か改行の後で行分割が可能となっています。 (記憶法: 詩では「コロン」は、行の一部。)

フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f。

format() 行のための、その時点での write() アキュムレータの値。 format には、$^A に結果を残す、formline() 呼び出しが含まれます。 自分のフォーマットを呼び出した後で、 write() は $^A の内容を出力してから消去します。 したがって、自分で formline() を呼び出すのでなければ、 $^A の値が見えることはありません。 perlformperlfunc/formline() を参照してください。

最後に close したパイプ、バッククォート (``) コマンド、 成功した wait() または waitpid() 呼び出し、system() 演算子が返したステータス。 このステータスワードは wait() システムコールが返した 16 ビットのステータス(またはそのように見えるもの)です。 従ってサブプロセスの exit 値は、実際には ($?>> 8) で、$? & 127 は、もしあれば、そのプロセスを止めたシグナルで、 $? & 128 はコアダンプがあるかどうかを示します。 (記憶法: shksh と同様。)

さらに、C で h_errno 変数に対応している場合は、 gethost*() が失敗したときに $? を通して返されます。

SIGCHLD のシグナルハンドラを設定した場合、 $? の値は通常ハンドラの外側では正しくない値となります。

END サブルーチンの内側では $? には exit() に渡されようとしている 値を含みます。 プログラムの終了ステータスを変更するために、END サブルーチン 内で $? を変更できます。 例えば:

    END {
	$? = 1 if $? == 255;  # die would make it 255
    } 

VMS では、use vmsish 'status' を指定すると、 $? はPOSIX ステータスをエミュレートしたものではなく、 実際の VMS 終了ステータスを反映します。

Error Indicators も参照して下さい。

数値として使われると、その時点の C の errno 変数の値が (通常の注意事項と共に) 得られます。 (これは、システムエラーを示す特定のエラーが得られた場合でもなければ、 $! の値が、特に何かを示すものであると、頼ってはならないということです。) 文字列として使われると、対応するシステムエラーのメッセージ文字列が得られます。 たとえば、$! にエラーの文字列を返して欲しいならば、あるいは、 die() 演算子の exit 値を設定するために、errno を設定するため $! へ代入を行なうことが可能です。 (記憶法: 何が bang(!) したか。)

Error Indicators も参照して下さい。

現在のオペレーティングシステムに特化したエラー情報です。 現在のところ、VMS, OS/2, Win32 (と MacPerl) のみで $! と異なる値をもちます。 その他のプラットフォームでは、$^E はいつも $! と同じです。

VMS では、$^E は最後のシステムエラーの VMS ステータス値です。 これは、最後のシステムエラーについて $! で提供されるものより 具体的な情報を示します。 これは特に $!EVMSERR にセットされた場合に重要です。

OS/2 では、$^E は CRT 経由、または Perl から直接呼び出された 最後の OS/2 API のエラーコードがセットされます。

Win32 では、$^E は Win32 API での最後のエラーの内容を返す GetLastError() Win32 呼び出しで報告される最新のエラー情報を 返します。 ほとんどの Win32 固有のコードはエラーを $^E 経由で返します。 ANSI C と Unix 風の呼び出しは errno をセットするので、 ほとんどの移植性のある Perl コードは $! 経由で エラーを報告します。

$! の説明で触れた問題点は一般的に $^E にも適用されます。 (記憶法: 追加の(Extra)エラーの説明。)

Error Indicators も参照して下さい。

最後の eval() 操作子による Perl の構文エラーメッセージです。 空文字列であれば、最後の eval() が正常に 解析され、実行されたことになります (が、実行した演算子が、 通常の意味で失敗しているかもしれません)。 (記憶法: どこで ("at" where) 構文エラーが起ったか。)

警告メッセージはこの変数に入りません。 しかし、後述する $SIG{__WARN__} にセットすることで 警告を処理するルーチンを設定できます。

Error Indicators も参照して下さい。

スクリプトを実行している Perl のプロセス番号です。 この変数は read-only と考えるべきですが、 fork() 呼び出しによって値は変わります。 (記憶法: シェルと同じ。)

本プロセスの実 uid を示します。 (記憶法: setuid で実行中であれば、そこ「から」来た uid です。)

本プロセスの実効 uid を示します。 例:

    $< = $>;		# set real to effective uid
    ($<,$>) = ($>,$<);	# swap real and effective uid

(記憶法: setuid で実行中であれば、そこ「へ」行く uidです。) $<$> の交換は、setreuid() をサポートしている マシンでのみ可能です。

本プロセスの実 gid を示します。 同時に複数のグループに 所属できるマシンでは、所属するグループをスペースで 区切ったリストが得られます。 最初の数値は、getgid() で返されるものです。 その後に getgroups() が返す値が続き、その中の 1 つは、 最初の値と同じかもしれません。

しかし、$( に代入された値は実際の gid に設定された値の 一つでなければなりません。 従って、 $( で与えられた値はゼロを足すことによって 数値化することなく $( に書き戻すべきではありません。

(記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実 gid は left した、 つまり離れたグループです。)

本プロセスの実効 gid を示します。 同時に複数のグループに所属できるマシンでは、 所属するグループをスペースで区切ったリストが得られます。 最初の数値は、getegid() で返されるものです。 その後に getgroups()が返す値が続き、その中の 1 つは、 最初の値と同じかもしれません。

同様に、$) へ代入する値はスペースで区切られた数値の リストでなければなりません。 最初の数値は実効 gid を設定し、残りの数値は(もしあれば) setgroups() に 渡されます。 setgroups() に空リストを渡したい場合は、単に新しい実効 gid を 繰り返してください。 つまり、実効 gid を 5 にして、setgroups() に空リストを渡したい場合は、 $) = "5 5" としてください。

(記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実効 gid は right な、つまり正しいグループです。)

$<, $>, $(, $) は、実行するマシンで、 対応する set[re][ug]id() ルーティンがサポートされているときにのみ 設定可能です。 $($) の交換は、 setregid() がサポートされているマシンでのみ可能です。

実行されているプログラムの名前を示します。 $0 に代入を行なうことで ps) プログラムが覗く、 引数エリアを修正できるシステムもあります。 実行しているプログラムを隠すよりは、 実行中のプログラムの状態を表示するときに、使うとよいでしょう。 (記憶法: shksh と同じ。)

BSD ユーザーへの注意: $0 に値をセットしても、ps(1) の出力から 完全に "perl" の文字列は取り除かれません。 例えば、$0"foobar" と設定すると、"perl: foobar (perl)" という 結果になります。これはオペレーティングシステムの機能です。

配列の最初の要素や、文字列の最初の文字のインデックスを 示します。 デフォルトは 0 ですが、理論的には、index() 関数や substr() 関数を評価するときに、Perl の動作をより awk (や Fortran) に近づけるため、1 に設定することもできます。 (記憶法: [ は添え字付けの始め。)

Perl 5 からは $[ への代入は、コンパイラへのディレクティブとして扱われ、 他のファイルの動作に影響を与えることがなくなりました。 この変数はできるだけ使わないようにしてください。

Perl インタプリタの version + patchlevel / 1000 が返されます。 スクリプトの最初で、そのスクリプトを実行しているインタプリタのバージョンが 適切な範囲内にあるかを調べる、といったことができます。 (記憶法: Perl のバージョンは、正しい範囲 (right bracket) にあるか。) 例:

    warn "No checksumming!\n" if $] < 3.019;

実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSIONrequire VERSION のドキュメントも 参照して下さい。

この変数は使わないようにしてください。 浮動小数点表現は数値比較が不正確に成ることがあります。 文字列比較が使える新しい Perl バージョンの表現方法である $^V を 参照して下さい。

-c スイッチに関連付けられた現在の値です。 主に -MO=... と共に用いられ、例えば AUTOLOAD を通常の遅延ロードでは なくコンパイル時に実行するといった、コンパイル時の振る舞いを 変えるために用います。perlcc を参照して下さい。 $^C = 1 に設定することは B::minus_c を呼び出すのと似ています。

デバッグフラグの現在の値を示します。 (記憶法: -D スイッチの値。)

システムが使用するファイル記述子の最大値を示し、 通常は 2 です。 システムファイル記述子は、exec() されたプロセスに渡されますが、 それ以降のファイル記述子は渡されません。 また、open() の実行中は、システムファイル記述子は、 たとえ open() が失敗しても、保存されます。 (通常のファイル記述子は、open() が実行される前にクローズされます。) ファイル記述子の close-on-exec のステータスは、exec() 時ではなく、 対応するファイル、パイプソケットの open 時の $^F の値によって 決められます。

警告: この変数は厳密に内部使用に限定されます。 その可用性、挙動、内容は告知なく変更される可能性があります。

この変数には Perl インタプリタのコンパイル時のヒントが入ります。 BLOCK のコンパイル終了時に、この変数の値は インタプリタが BLOCK のコンパイルを開始した時の値に戻されます。

Perl がレキシカルスコープを持つブロック構造(eval の中身、required された ファイル、サブルーチンの中身、loop の中身、条件付きブロック)の パーズを開始するとき、現在の $^H の値は保存されますが、 値は変更されません。 ブロックのコンパイルが終わると、保存された値が戻されます。 値の保存と回復の間の地点で、 BEGIN ブロックの中で実行されるコードは自由に $^H の値を変更できます。

この振る舞いはレキシカルスコープを持ち、その中で使えます。 例としては use strict があります。

内容は整数であるべきです。 ビット毎に異なるプラグマフラグとして使われます。以下は例です:

    sub add_100 { $^H |= 0x100 }
    sub foo {
	BEGIN { add_100() }
	bar->baz($boon);
    }

BEGIN ブロックの実行中に起こることを考えてみます。 この時点で BEGIN ブロックは既にコンパイルされていますが、 foo() の中身はまだコンパイル中です。 従って $^H の新しい値は foo() の中身がコンパイル中にのみ 見ることが出来ます。

上記の BEGIN ブロックを以下のように変更すると:

    BEGIN { require strict; strict->import('vars') }

どのように use strict 'vars' が実装されているかがわかります。 以下は同じレキシカルプラグマの条件付き版です:

    BEGIN { require strict; strict->import('vars') if $condition }

警告: この変数は厳密に内部使用に限定されます。 その可用性、挙動、内容は告知なく変更される可能性があります。

%^H ハッシュは $^H と同じスコープを持ちます。 これはレキシカルスコープを持つプラグマを実装するのに便利です。

置き換え編集の拡張子の値を示します。 置き換え編集を禁止するためには、undef を設定します。 (記憶法: -i スイッチの値。)

デフォルトでは、メモリ不足はトラップできない致命的エラーとなります。 しかし、もし適切に構築されていれば、Perl は $^M の中身を die() した後の緊急用メモリとして使えます。 Perl が -DPERL_EMERGENCY_SBRK 付きでコンパイルされ、 Perl の malloc を使うと仮定します。そして、

    $^M = 'a' x (1 << 16);

とすると緊急用の 64K のバッファを割り当てます。 このオプションを有効にする方法についての情報は Perl 配布パッケージに含まれている INSTALL ファイルを参照して下さい。 この拡張機能を気軽に使えないようにするために、 この変数には English の長い名前はありません。

この Perl が構築されたオペレーティングシステムの名前です。 これは設定プロセス中に決定されます。 この値は $Config{'osname'} と同じです。 Config と、perlrun でドキュメント化されている -V コマンドラインスイッチも参照して下さい。

デバッグ機能のための内部変数です。 それぞれのビットの意味は変わるかもしれませんが、 現在のところは以下の通りです:

  1. x01

    サブルーチンの出入りをデバッグします。

  2. x02

    行毎にデバッグします。

  3. x04

    最適化を行いません。

  4. x08

    将来の対話的な検査のためにより多くのデータを保存します。

  5. x10

    サブルーチンが定義されたソース行に関する情報を保持します。

  6. x20

    シングルステップ実行で開始します。

  7. x40

    報告時にサブルーチン名でなくサブルーチンのアドレスを使います。

  8. x80

    goto &subroutine も同様に報告します。

  9. x100

    eval に対して、コンパイルされた位置を元にした「ファイル」名を提供します。

  10. x200

    無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。

コンパイル時にのみ有効なビットもあり、実行時にのみ有効なビットもあります。 これは新しいメカニズムであり、詳細は変わるかもしれません。

最後に成功した (?{ code }) 正規表現アサートの評価の結果です (perlre を参照して下さい)。おそらくもっと書き足します。

現在のインタプリタの状態を示します。 現在のモジュール/eval のパーズが終了していない場合は 未定義です(これは $SIG{__DIE__} と $SIG{__WARN__} のハンドラで 起こり得ます)。 eval() の内部では真、それ以外では偽となります。

プログラムを実行開始した時刻を、紀元 (1970年の始め) からの秒数で示したものです。 ファイルテスト -M-A-C で返される値は、この値に基づいています。

Perl インタプリタの revision, version, subversion を それぞれの序数の文字からなる文字列で表現します。 つまり Perl v5.6.0 では chr(5) . chr(6) . chr(0) となり、 $^V eq v5.6.0 は真を返します。 この文字列の文字は Unicode の範囲に入るかもしれないことに注意してください。

これはスクリプトを実行している Perl インタプリタのバージョンが 正しい範囲に入っているかを調べるのに使えます。(記憶法: ^V をバージョンコントロールに使います。) 例:

    warn "No \"our\" declarations!\n" if $^V and $^V lt v5.6.0;

実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSIONrequire VERSION のドキュメントを 参照して下さい。

Perl バージョンの古い表現については $] も参照して下さい。

警告スイッチの値で、-w スイッチが使われると内部的に真となり、 そうでない場合は直接変更可能です。 (記憶法: -w スイッチに関係します。) warnings も参照して下さい。

use warnings プラグマで有効にされた、現在の警告チェックの集合です。 詳細については warnings のドキュメントを参照して下さい。

Perl によるシステムコールで、システムにネイティブなワイド文字 API を (もし使えるなら)使うようにするグローバルフラグです。 これは現在 Windows プラットフォームでのみ実装されています。

これはコマンドラインで -C スイッチを使うことでも有効になります。

初期値は典型的には 0 で、これは Perl バージョン 5.6 以前との 互換性のためです。 しかし、システムがユーザー定義可能なデフォルト($ENV{LC_CTYPE} など)を 提供している場合は、Perl によって自動的に 1 にセットされることもあります。

bytes プラグマは常に現在のレキシカルスコープでの このフラグの効果を上書きします。bytes を参照して下さい。

Perl バイナリ自身が実行された時の名前を C の argv[0] から持ってきたものです。 フルパスではないかもしれませんし、検索パスにないかもしれません。

<> から読込みを行なっているとき、その時点のファイル名を示します。

配列 @ARGV は、コマンドラインからスクリプトに渡す引数が入れられます。 $ARGV[0]プログラムのコマンド名自身ではなく、 最初の引数ですから、$#ARGV は一般には、引数の個数 - 1 となります。 コマンド名については、$0 を参照してください。

配列 @INC には、do EXPR、require、use によってライブラリファイルを 探すときに評価する場所のリストが納められています。 初期状態では、コマンドラインスイッチ -I の引数と デフォルトの Perl ライブラリディレクトリ (おそらく /usr/local/lib/perl5) とカレントディレクトリを表わす "." を順につなげたものです。 実行時にこれを変更する必要がある場合は、 マシン依存のライブラリを正しく読み込むために use lib も使うべきです:

    use lib '/mypath/libdir/';
    use SomeMod;

サブルーチンの内部では、配列 @_ はサブルーチンに渡されたパラメータです。 perlsub を参照して下さい。

ハッシュ %INC は、do, require, use演算子によって インクルードされた、個々のファイル名をエントリとして持っています。 key は指定したファイル名(モジュール名はパス名に変換されます)で、 value は見つかった場所となっています。 require 演算子は、指定されたファイル名が既に インクルードされているかを、このハッシュを使って調べます。

ハッシュ %ENV には、その時点の環境変数が設定されています。 ENV に値を設定することで、 以後に fork() した子プロセスの環境変数を変更します。

ハッシュ %SIG にはシグナルのためのシグナルハンドラが含まれています。例:

    sub handler {	# 1st argument is signal name
	my($sig) = @_;
	print "Caught a SIG$sig--shutting down\n";
	close(LOG);
	exit(0);
    }
    $SIG{'INT'}  = \&handler;
    $SIG{'QUIT'} = \&handler;
    ...
    $SIG{'INT'}  = 'DEFAULT';	# restore default action
    $SIG{'QUIT'} = 'IGNORE';	# ignore SIGQUIT

'IGNORE' という値は通常はシグナルの効果を無視するために使いますが、 CHLD シグナルは例外です。 この特別な場合に関する詳細は perlipc を参照して下さい。

以下にその他の例を示します:

    $SIG{"PIPE"} = "Plumber";   # main::Plumber を仮定します(非推奨)
    $SIG{"PIPE"} = \&Plumber;   # 問題なし; カレントの Plumber を仮定します
    $SIG{"PIPE"} = *Plumber;    # 少々難解
    $SIG{"PIPE"} = Plumber();   # げげ、Plumber() は何を返すの??

裸の単語をシグナルハンドラの名前として使わないようにしてください。 不注意で呼び出すのを避けるためです。

システムに sigaction() 関数がある場合は、 シグナルハンドラはこの関数を使って設定されます。 これにより、信頼性のあるシグナルハンドリングが可能になります。 システムに SA_RESTART フラグがある場合は、 シグナルハンドラはこれを使います。 これによりこれにより再開に対応しているシステムコールは シグナルが到着したときに返らずに再開します。 シグナルが届いたときにシステムコールを中断したい場合は 以下のようにしてください:

    use POSIX ':signal_h';
    my $alarm = 0;
    sigaction SIGALRM, new POSIX::SigAction sub { $alarm = 1 }
    	or die "Error setting SIGALRM handler: $!\n";

POSIX を参照して下さい。

ある種の内部フックも %SIG ハッシュを使ってセットされます。 警告メッセージを表示しようとするときに $SIG{__WARN__} で 示されたルーチンが呼び出されます。 警告メッセージは最初の引数として渡されます。 __WARN__ フックがあると、通常の STDERR への警告の出力は行われません。 これを使って、警告メッセージを変数にいれたり、 あるいは以下のようにして警告を致命的エラーに変えたり出来ます:

    local $SIG{__WARN__} = sub { die $_[0] };
    eval $proggie;

$SIG{__DIE__} で示されるルーチンは 致命的な例外がまさに投げられようとするときに呼び出されます。 エラーメッセージは最初の引数として渡されます。 __DIE__ フックから戻ると、 例外処理はフックがなかったかのように再開されますが、 フックルーチン自体が goto、ループ終了、die() によって 終了した場合を除きます。 __DIE__ ハンドラは呼び出し中は明示的に無効になりますので、 __DIE__ ハンドラから die できます。 __WARN__ も同様です。

実装上の不具合により、$SIG{__DIE__} は eval() の中でも 呼び出されます。これを、$@ の待っている例外を書き換えたり、 CORE::GLOBAL::die() を上書きするのに使わないでください。 この奇妙な行動は将来のリリースで修正される予定なので、 $SIG{__DIE__} は当初の目的通り、 プログラムが終了するときにのみ呼び出されるようになります。 その他の用途は非推奨です。

__DIE____WARN__ のハンドラは一つの点で非常に特別です。 パーザによってエラー(であろうもの)を報告するために呼び出されることがある ことです。 このような場合、パーザは不安定な状態になっているかもしれないので、 ハンドラから Perl コードを評価しようとするとセグメンテーションフォールトが 発生するかもしれません。 Perl のパーズ中の警告やエラーは、以下のように非常に注意して扱うべきです。

    require Carp if defined $^S;
    Carp::confess("Something wrong") if defined &Carp::confess;
    die "Something wrong, but could not load Carp to give backtrace...
         To see backtrace try starting Perl with -MCarp switch";

一行目は、パーザがハンドラを呼び出したのでなければ Carp を読み込みます。 二行目は、Carp が使えるならバックとレースを表示して die します。 三行目は Carp が使えないときにのみ実行されます。

追加の情報については perlfunc/die, perlfunc/warn, perlfunc/eval, warnings を参照して下さい。

Error Indicators

(エラー指示子)

変数 $@, $!, $^E, $? は Perl プログラムの実行中に 発生した、異なる種類のエラー情報を保持します。 変数はエラーを報告した副システムと Perl プロセスとの「距離」 の順番に並んでいます。 これらはそれぞれ、Perl インタプリタ、C ライブラリ、 オペレーティングシステム、外部プログラムによって検出された エラーに対応しています。

これらの変数の違いを示すために、 以下のようなシングルクォートを用いた Perl 式を考えます:

    eval q{
	open PIPE, "/cdrom/install |";
	@res = <PIPE>;
	close PIPE or die "bad pipe: $?, $!";
    };

この文を実行した後、4 つの変数全てがセットされる可能性があります。

$@eval された文字列がコンパイルされなかったとき (これは openclose が正しくない プロトタイプでインポートされたときに起こり得ます)、 または評価中に実行している Perl コードが die() したときにセットされます。 これらの場合には $@ の値はコンパイルエラー、または die への引数(これには $!$? が差し挟まれます!)です。 (しかし、Fatal も参照して下さい。)

上記の eval() 式が実行された後、 open(), <PIPE>, close は C ランタイムライブラリの呼び出しに 変換され、それからオペレーティングシステムコールに変換されます。 $! はこれらの呼び出しのどれかが失敗したとき、 C ライブラリの errno の値がセットされます。

いくつかのオペレーティングシステムでは、 $^E により詳細なエラー指示子が入っているかもしれません。 今回の場合で言えば、"CDROM tray not closed." などです。 追加のエラーメッセージに対応していないシステムでは、 $^E$! と同じ値です。

最後に、$? は外部プログラム /cdrom/install が失敗したときに 非 0 にセットされるかもしれません。 上位の 8 ビットはプログラムが遭遇した特定のエラー状況 (プログラムの exit() の値)を反映します。 下位の 8 ビットは、シグナルの死亡やコアダンプ情報と言った失敗のモードを反映します。 詳細については wait(2) を参照して下さい。 $!$^E はエラー状況が検出されたときにのみ設定されますが、 変数 $?wait やパイプの close の度に、前の値を上書きします。 これは、$@ が eval() の実行毎に、エラーならセットされ、 成功ならクリアされるという動作と似ています。

より詳細については、$@, $!, $^E, $? それぞれの説明を 参照して下さい。

Technical Note on the Syntax of Variable Names

(変数名の文法に関するテクニカルノート)

Perl の変数名は様々な形があります。 通常、変数名は英文字か下線で始まらなければならず、 任意の長さ(内部制限の 251 文字まで)を取ることができ、 英文字、数字、下線、特別な文字列である ::' を含むことができます。 この場合、最後の :: または ' の前は パッケージ限定子 として扱われます。 perlmod を参照して下さい。

Perl の変数は、数字の列または一文字の句読点かコントロール文字の 場合もあります。 これらの名前は全て Perl によって特別な用途のために予約されています。 例えば、全て数字の名前は正規表現マッチの後の後方参照のデータを 保持するために用いられます。 Perl には一文字のコントロール文字の名前のための特別な文法があります。 ^X(キャレット X)は control-X キャラクタを意味します。 例えば、$^W(ドル記号 キャレット W)は control-W 一文字の 名前をもつスカラ変数です。 これはプログラム中にリテラルな control-W をタイプするより 良いです。

最後に、Perl 5.6 の新機能として、コントロール文字(もっと言えばキャレット)で 始まる、英数字からなる文字列の変数名も使えます。 これらの変数は ${^Foo} の形で書かれなければなりません。 括弧は必須です。 ${^Foo} はコントロール-F の後に二つ o が続く名前を持つ スカラ変数です。 これらの変数は Perl によって特別な用途のために予約されていますが、 ^_ (コントロール-下線またはキャレット-下線)で始まるものは例外です。 ^_ で始まるコントロール文字名は Perl の将来のバージョンで 特別な意味を持つことはありません。 従ってこれらの名前はプログラム中で安全に使用できます。 但し、$^_ そのものは 予約されます

数字、コントロール文字、句読点で始まる Perl の識別子は package 宣言の効果から逃れて、常に main パッケージにあるものとして 扱われます。さらに以下のものも逃れます:

	ENV		STDIN
	INC		STDOUT
	ARGV		STDERR
	ARGVOUT
	SIG

特に、新しい特別な ${^_XYZ} 変数はスコープ内の package 宣言に関わらず 常に main パッケージとして扱われます。

BUGS

(バグ)

Perl の実装における不幸な事故により、 use English はプログラム中の全ての正規表現マッチングにおいて かなりの性能低下を引き起こします。 これは use English のスコープ内かどうかに関わりません。 この理由により、ライブラリで use English を使うのは できるだけ避けてください。 さらなる情報については CPAN の Devel::SawAmpersand モジュール (http://www.perl.com/CPAN/modules/by-module/Devel/) の ドキュメントを参照して下さい。

例外ハンドラの中で $^S を使おうなどとは考えてもいけません。 現在の実装の $SIG{__DIE__} は面倒を引き寄せ、エラーの追跡を困難にします。 これの代わりに END{} を使うか、CORE::GLOBAL::die をオーバーライドしてください。