perlvar - Perl で定義済みの変数
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
パッケージとして扱われます。
以下の名前は Perl では特別な意味を持ちます。 記号的な名前の多くは記憶法があるか、シェルでの類推が可能です。 それでも長い名前を使用したい場合には
use English;
とプログラムの最初に書いてください。 これは、すべての短い名前の別名として、 カレントパッケージで長い名前を付けるものです。 awk から持ってきた中間的な名前を持っているものもあります。 パフォーマンスの影響を避けるために、もし $PREMATCH
, $MATCH
, $POSTMATCH
が必要ないなら、これらなしで English
モジュールを使うのが 最善です:
use English '-no_match_vars';
先に進む前に、変数のソート順に注意してください。 一般的に、変数を大文字小文字を無視して、ほとんど辞書順に並んでいます (${^UNICODE}
や $^T
先頭についている {
や ^
は無視します)が、 $_
と @_
は先頭に来ます。 同じ識別子を持つ変数については、スカラ、配列、ハッシュ、裸の単語の順に 並べています。
デフォルトの入力とパターン検索のスペース。 以下の 2つは同値です:
while (<>) {...} # while の中でのみ等価!
while (defined($_ = <>)) {...}
/^Subject:/
$_ =~ /^Subject:/
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
chomp
chomp($_)
あなたが使いたくなくても Perl が $_
を仮定する場合がいくつかあります:
以下の関数は $_
をデフォルト引数として使います:
abs, alarm, chomp, chop, chr, chroot, cos, defined, eval, evalbytes, exp, glob, hex, int, lc, lcfirst, length, log, lstat, mkdir, oct, ord, pos, print, quotemeta, readlink, readpipe, ref, require, reverse (スカラコンテキストのみ), rmdir, sin, split (の 2 番目の引数), sqrt, stat, study, uc, ucfirst, unlink, unpack.
デフォルトが STDIN である -t
を除く全てのファイルテスト(-f
, -d
) 。 "-X" in perlfunc を参照してください。
=~
演算子なしで用いられたパターンマッチ演算 m//
, s///
, tr///
(またの名を y///
)。
foreach
ループでの他の変数が補われなかった場合のデフォルトの 繰り返し変数。
grep()
関数と map()
関数の暗黙の繰り返し変数。
given()
の暗黙の変数。
<FH>
が単独で while
テストでテストされた場合の 結果を入れるデフォルトの場所。 while
テスト以外ではこれは起こりません。
$_
はグローバル変数なので、望まないような副作用を引き起こす場合があります。 perl 5.10 から、ファイルやブロックで my
で宣言することで、 レキシカル版の $_
が使えます。 さらに、our $_
という宣言は現在のスコープでグローバルな $_
を 再構築します。
記憶法: 下線はある操作を覚えるためのもの。
サブルーチンに入るときには、配列 @_
はサブルーチンに渡された パラメータです。 サブルーチンの内部では、@_
は配列演算子 push
, pop
, shift
, unshift
のデフォルト配列です。
perlsub を参照して下さい。
配列や配列スライスがダブルクォートされた文字列あるいは /.../
のような 同様のコンテキスト展開されたとき、その要素はこの値で分割されます。 デフォルトは空白です。 例えば、以下のものは:
print "The array is: @array\n";
以下と等価です:
print "The array is: " . join($", @array) . "\n";
記憶法: ダブルクォートされた内容に対して動作します。
このスクリプトを実行している Perl のプロセス番号です。 この変数に値を設定することは 可能 ですが、そうすることは一般的に 非推奨です; しかしこれは一部のテストの目的には計り知れない価値があります。 fork()
呼び出しがあると自動的にリセットされます。
Linux および Debian GNU/kFreeBSD ユーザーに対する注意: Perl v5.16.0 より 前では perl は LinuxThreads を使って Linux システムで POSIX の意味論を エミュレートしていました; これは POSIX Threads の部分的な実装で、 Native POSIX Thread Library (NPTL) で置き換えられました。
LinuxThreads は Linux では古いもので、このように getpid()
を キャッシュすると組み込み perl が不必要に複雑になります ($$ の値を手動で 更新する必要があるからです); それで今では $$
と getppid()
は常に 基礎となる C ライブラリと同じ値を返します。
Debian GNU/kFreeBSD システムは 6.0 リリースまで LinuxThreads を 使っていましたが、その後は POSIX 風の FreeBSD スレッドの意味論に 移行しました。
あなたのシステムがこの非一貫性の影響を受けるかどうかを調べるには、 getconf GNU_LIBPTHREAD_VERSION | grep -q NPTL
が偽を返すかどうかを チェックしてください。 NTPL スレッドは POSIX の意味論を保存します。
記憶法: シェルと同じ。
実行されているプログラムの名前を示します。
一部の(しかし全てではありません)オペレーティングシステムでは $0
に代入を行なうことで ps プログラムが見る引数エリアを修正します。 プラットフォームによっては、この変更を見るために 特殊な ps
オプションや、 他の ps
を使う必要があるものもあります。 $0
の修正は、実行しているプログラムを隠すよりは、 実行中のプログラムの状態を表示するときに、使うとよいでしょう。
$0
の最大長にはプラットフォーム固有の制限があることに注意してください。 最も極端な場合では、元の $0
で占められているサイズに制限されます。
プラットフォームによっては、任意の量のパッディングがある場合があります; 例えば、ps
で見られる修正された名前の後の空白文字です。 プラットフォームによっては、このパッディングは、あなたが何をしたかに 関わらず、元の引数のエリア全体に拡張されるものもあります (例えば、これは Linux 2.2 の場合です)。
BSD ユーザーへの注意: $0
に値をセットしても、ps(1) の出力から 完全に "perl" の文字列は取り除かれません。 例えば、$0
に "foobar"
と設定すると、"perl: foobar (perl)"
という 結果になります ("perl: "
接頭辞と" (perl)" 接尾辞が表示されるかどうかは 、正確な BSD の種類とバージョンに依存します)。 これはオペレーティングシステムの機能で、Perl は何もできません。
マルチスレッドスクリプトでは、どのスレッドも自身の $0
のコピーを 変更できて、その変更が(OS が対応しているとして) ps(1) で見えるように、 Perl がスレッドを調整します。 他のスレッドが持っている $0
の見え方は(各自が自身のコピーを 持っているので)変わらないことに注意してください。
プログラムが perl に -e
または -E
オプション経由で与えられた場合、 $0
には文字列 "-e"
を含みます。
Linux では perl 5.14 以降、perl がバージョン 4.000 以降行っていた argv[0]
経由での POSIX 名の置き換えに加えて、 レガシープロセス名は prctl(2)
で設定されます。 今では ps, top, killall のようにレガシープロセス名を読むユーティリティは $0
に代入することに設定される名前を認識します。 指定した文字列は 16 バイトに切り詰められます; これは Linux による 制限です。
記憶法: sh や ksh と同じ。
本プロセスの実 gid を示します。 同時に複数のグループに所属できるマシンでは、所属するグループをスペースで 区切ったリストが得られます。 最初の数値は、getgid()
で返されるものです; その後に getgroups()
が 返す値が続き、その中の 1 つは、最初の値と同じかもしれません。
しかし、$(
に代入された値は実際の gid に設定された値の 一つでなければなりません。 従って、 $(
で与えられた値はゼロを足すことによって 数値化することなく $(
に書き戻すべきではありません。 これはリストが得られる実行 GID ($)
) とは違うことに注意してください。
POSIX::setgid()
を使って、実 GID と実効 GID の両方を同時に変更できます。 $(
を変更した場合は、変更しようとしたときに起こりうるエラーを検出するために $!
をチェックする必要があります。
記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実 gid は left した、つまり離れたグループです。
本プロセスの実効 gid を示します。 同時に複数のグループに所属できるマシンでは、所属するグループをスペースで 区切ったリストが得られます。 最初の数値は、getegid()
で返されるものです; その後に getgroups()
が 返す値が続き、その中の 1 つは、最初の値と同じかもしれません。
同様に、$)
へ代入する値はスペースで区切られた数値の リストでなければなりません。 最初の数値は実効 gid を設定し、残りの数値は(もしあれば) setgroups()
に 渡されます。 setgroups()
に空リストを渡したい場合は、単に新しい実効 gid を 繰り返してください; つまり、実効 gid を 5 にして、setgroups()
に空リストを 渡したい場合は、 $) = "5 5"
としてください。
POSIX::setgid()
を使って、実効 GID と実 GID を同時に変更できます (1 つの数値引数だけが使えます)。 $)
を変更した場合は、変更時に起こりうるエラーを検出するために $!
の チェックが必要です。
$<
, $>
, $(
, $)
は、実行するマシンで、 対応する set[re][ug]id() ルーティンがサポートされているときにのみ 設定可能です。 $(
と $)
の交換は、 setregid()
がサポートされているマシンでのみ可能です。
記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実効 gid は right な、つまり正しいグループです。
本プロセスの実 uid を示します。 POSIX::setuid()
を使って、実効 UID と実 UID を同時に変更できます。 $<
の変更にはシステムコールが必要なので、起こりうるエラーを 検出するために $!
のチェックが必要です。
記憶法: setuid で実行中であれば、そこ「から」来た uid です。
本プロセスの実効 uid を示します。 例えば:
$< = $>; # 実 uid に実効 uid を設定
($<,$>) = ($>,$<); # 実 uid と実効 uid を交換
POSIX::setuid()
を使って、実効 UID と実 UID を同時に変更できます。 $>
を変更した場合は、変更時に起こりうるエラーを検出するために $!
のチェックが必要です。
$<
と $>
の交換は、setreuid()
をサポートしている マシンでのみ可能です。
記憶法: setuid で実行中であれば、そこ へ 行く uid です。
多次元配列のエミュレートのための添え字の区切文字。 ハッシュの要素を
$foo{$a,$b,$c}
のようにして参照すると、実際には以下のようになります
$foo{join($;, $a, $b, $c)}
しかし、以下のようにしてはいけません
@foo{$a,$b,$c} # スライス--@ に注意
これは以下の意味になります
($foo{$a},$foo{$b},$foo{$c})
デフォルトは "\034" で、awk
の SUBSEP と同じです。 使おうとしている key の値がバイナリのデータを含むならば、 $;
に設定する安全な値などはないことになります。
perllol で記述している「本物の」多次元配列を使うようにしてください。
記憶法: コンマ (構文上の添え字区切り文字) は セミ−セミコロンなのです。
sort()
を使うときの特殊パッケージ変数です; "sort" in perlfunc を 参照してください。 この特殊性により、$a
と $b
は、たとえ strict 'vars'
プラグマを 使っているときでも (use vars
や our()
を使って) 宣言する必要が ありません。 これを sort()
比較ブロックや関数で使えるようにしたい場合は、 my $a
や my $b
としてレキシカル化しないでください。
ハッシュ %ENV
には、その時点の環境変数が設定されています。 ENV
に値を設定することで、 以後に fork()
した子プロセスの環境変数を変更します。
システムが使用するファイル記述子の最大値を示し、通常は 2 です。 システムファイル記述子は、exec()
されたプロセスに渡されますが、 それ以降のファイル記述子は渡されません。 また、open()
の実行中は、システムファイル記述子は、 たとえ open()
が失敗しても、保存されます (通常のファイル記述子は、open()
が実行される前にクローズされます)。 ファイル記述子の close-on-exec のステータスは、exec()
時ではなく、 対応するファイル、パイプソケットの open 時の $^F
の値によって 決められます。
自動 split モードが有効の場合、配列 @F
には読み込んだ行のフィールドを 含みます。 -a オプションについては perlrun を参照してください。 この配列はパッケージ固有であり、もし strict 'vars'
で実行していて パッケージ main 以外の場合は完全なパッケージ名で定義したり与えたり しなければなりません。
配列 @INC
には、do EXPR
, require
, use
によってライブラリファイルを 探すときに評価する場所のリストが納められています。 初期状態では、コマンドラインスイッチ -I の引数と デフォルトの Perl ライブラリディレクトリ (おそらく /usr/local/lib/perl5) とカレントディレクトリを表わす "." を順につなげたものです。 (-T
か -t
によって汚染チェックが有効の場合は、"." は追加されません。) 実行時にこれを変更する必要がある場合は、マシン依存のライブラリも正しく 読み込むために use lib
を使うべきです:
use lib '/mypath/libdir/';
use SomeMod;
Perl のコードを直接 @INC
に入れることで、ファイルインクルード機構に フックを挿入できます。 このフックはサブルーチンリファレンス、配列リファレンス、bless された オブジェクトが可能です。 詳細については "require" in perlfunc を参照してください。
ハッシュ %INC
は、do
, require
, use
演算子によって インクルードされた、個々のファイル名をエントリとして持っています。 key は指定したファイル名(モジュール名はパス名に変換されます)で、 value は見つかった場所となっています。 require
演算子は、指定されたファイル名が既に インクルードされているかを、このハッシュを使って調べます。
ファイルがフック(つまりサブルーチンリファレンス; フックに関する 説明については "require" in perlfunc を参照してください)経由で読み込まれた 場合、このフックはデフォルトではファイル名の代わりに %INC
に挿入されます。 しかし、フックはさらなる特定の情報を提供するために、自身で %INC
エントリを セットするかもしれないことに注意してください。
置き換え編集の拡張子の値を示します。 置き換え編集を禁止するためには、undef
を設定します。
記憶法: -i スイッチの値。
デフォルトでは、メモリ不足はトラップできない致命的エラーとなります。 しかし、もし適切に構築されていれば、Perl は $^M
の中身を die()
した後の緊急用メモリとして使えます。 Perl が -DPERL_EMERGENCY_SBRK
付きでコンパイルされ、 Perl の malloc を使うと仮定します。そして、
$^M = 'a' x (1 << 16);
とすると緊急用の 64K のバッファを割り当てます。 perl をコンパイルするときに独自の C コンパイルフラグを追加する 方法についての情報は、Perl 配布パッケージに含まれている INSTALL ファイルを参照して下さい。 この拡張機能を気軽に使えないようにするために、 この変数には English の長い名前はありません。
この変数は Perl 5.004 で追加されました。
この Perl が構築されたオペレーティングシステムの名前です; これは設定プロセス中に決定されます。 例えば "PLATFORMS" in perlport を参照してください。
この値は $Config{'osname'}
と同じです。 Config と、perlrun で文書化されている -V コマンドラインスイッチも参照して下さい。
Windows プラットフォームでは、$^O
はあまり役に立ちません: これは常に MSWin32
となり、95/98/ME/NT/2000/XP/CE/.NET の違いを示していないからです。 これらを区別するためには、Win32::GetOSName()
や Win32::GetOSVersion() を 使ってください (Win32 と perlport を参照してください)。
この変数は Perl 5.003 で追加されました。
ハッシュ %SIG
にはシグナルのためのシグナルハンドラが含まれています。 例えば:
sub handler { # 最初の引数はシグナル名
my($sig) = @_;
print "Caught a SIG$sig--shutting down\n";
close(LOG);
exit(0);
}
$SIG{'INT'} = \&handler;
$SIG{'QUIT'} = \&handler;
...
$SIG{'INT'} = 'DEFAULT'; # デフォルトの動作を復元
$SIG{'QUIT'} = 'IGNORE'; # SIGQUIT を無視
'IGNORE'
という値は通常はシグナルの効果を無視するために使いますが、 CHLD
シグナルは例外です。 この特別な場合に関する詳細は perlipc を参照して下さい。
以下にその他の例を示します:
$SIG{"PIPE"} = "Plumber"; # main::Plumber を仮定します(非推奨)
$SIG{"PIPE"} = \&Plumber; # 問題なし; カレントの Plumber を仮定します
$SIG{"PIPE"} = *Plumber; # 少々難解
$SIG{"PIPE"} = Plumber(); # げげ、Plumber() は何を返すの??
裸の単語をシグナルハンドラの名前として使わないようにしてください; 不注意で呼び出すのを避けるためです。
システムに sigaction() 関数がある場合は、シグナルハンドラが インストールされ使われました。 これにより、信頼性のあるシグナルハンドリングが可能になります。
デフォルトのシグナル配送ポリシーは Perl 5.8.0 に即時("unsafe"としても 知られます)から保留(「安全なシグナル」としても知られます)に変更されました。 さらなる情報については perlipc を参照してください。
ある種の内部フックも %SIG ハッシュを使ってセットされます。 警告メッセージを表示しようとするときに $SIG{__WARN__}
で 示されたルーチンが呼び出されます。 警告メッセージは最初の引数として渡されます。 __WARN__
フックがあると、通常の STDERR
への警告の出力は行われません。 これを使って、警告メッセージを変数にいれたり、 あるいは以下のようにして警告を致命的エラーに変えたり出来ます:
local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
__WARN__
では 'IGNORE'
フックには対応していないので、空サブルーチンを 使って警告を無効に出来ます:
local $SIG{__WARN__} = sub {};
$SIG{__DIE__}
で示されるルーチンは 致命的な例外がまさに投げられようとするときに呼び出されます。 エラーメッセージは最初の引数として渡されます。 __DIE__
フックから戻ると、 例外処理はフックがなかったかのように再開されますが、 フックルーチン自体が goto &sub
、ループ終了、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...\n\t"
. "To see backtrace try starting Perl with -MCarp switch";
一行目は、パーザが ハンドラ
を呼び出したのでなければ Carp を読み込みます。 二行目
は、Carp が使えるならバックとレースを表示して die します。 三行目は Carp が使えないときにのみ実行されます。
例外ハンドラの中で $^S
を使おうなどとは考えてもいけません。 現在の実装の $SIG{__DIE__}
は面倒を引き寄せ、エラーの追跡を困難にします。 これの代わりに END{}
を使うか、CORE::GLOBAL::die をオーバーライドしてください。
追加の情報については "die" in perlfunc, "warn" in perlfunc, "eval" in perlfunc, warnings を参照して下さい。
プログラムを実行開始した時刻を、紀元 (1970年の始め) からの秒数で示したものです。 ファイルテスト -M、-A、-C で返される値は、この値に基づいています。
version
オブジェクトとして表現される revision, version, subversion。
この変数は perl 5.6.0 で最初に現れました; それより前のバージョンでは 未定義値となります。 perl 5.10.0 以前では $^V
は v-string 形式で表現されます。
$^V
はスクリプトを実行している Perl インタプリタのバージョンが 正しい範囲に入っているかを調べるのに使えます。 例えば:
warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1
$^V
を文字列表現に変換するには sprintf()
の "%vd"
変換を使います:
printf "version is v%vd\n", $^V; # Perl のバージョン
実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSION
と require VERSION
のドキュメントを 参照して下さい。
Perl バージョンの古い表現については $]
も参照して下さい。
この変数は Perl 5.6 で追加されました。
記憶法: ^V をバージョンコントロールに使います。
この変数が真の値にセットされると、Windows での stat()
はファイルを オープンしようとはしません。 これは、このファイルへの追加のハードリンクが存在する場合、リンクカウントを 決定できませんし、ファイル属性が古いものになるかもしれないことを 意味します。 一方、ファイルを開かないので、(特にファイルがネットワークドライブにある 場合は)大幅に高速です。
デフォルトで「ずさんな」stat()
を使うために、この変数は、ローカルな Perl を設定するための sitecustomize.pl で設定できます。 サイトカスタマイズに関するさらなる情報については perlrun の -f を参照してください。
この変数は Perl 5.10 で追加されました。
Perl バイナリ自身が実行された時の名前を C の argv[0] または (対応していれば) /proc/self/exe から持ってきたものです。
ホスト OS に依存して、$^X
の値は perl プログラムファイルの絶対パスかも しれませんし、相対パスかもしれませんし、perl を起動するために使われる 文字列ではありますが perl プログラムファイルのパス名ではないかもしれません。 また、ほとんどの OS は PATH 環境変数にない位置のプログラムを起動することを 許しているので、$^X
の値が PATH にある保証はありません。 VMS では、この値はバージョン番号を含む場合も含まない場合もあります。
通常は、現在実行中のものと同じ perl の独立したコピーを再起動するために $^X
の値を使えます; つまり:
@first_run = `$^X -le "print int rand 100 for 1..100"`;
しかし、全ての OS が fork やコマンドの出力の捕捉に対応しているわけでは ないので、この複雑な文は移植性がないかもしれないことを忘れないでください。
$^X
の値をファイルのパス名として使うのは安全ではありません; 実行ファイルに固定の接尾辞があり、コマンドの起動時には接尾辞が不要な OS も あるからです。 $^X
の値をパス名に変換するには、以下のコードを使ってください:
# (コマンド名ではなく)ファイル名を構築する。
use Config;
my $this_perl = $^X;
if ($^O ne 'VMS') {
$this_perl .= $Config{_exe}
unless $this_perl =~ m/$Config{_exe}$/i;
}
多くの OS が Perl のプログラムファイルのコピーを作って、コピーに パッチを当て、それを実行するための読み込み権限を全員に与えているので、 セキュリティ意識のある Perl プログラマは $^X
で参照されているコピーではなく、 インストールされている perl を起動するように気をつけるべきです。 以下のコードはこの目的を達成し、コマンドとして起動したりファイルとして 参照するためのパス名を作成します。
use Config;
my $secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS') {
$secure_perl_path .= $Config{_exe}
unless $secure_perl_path =~ m/$Config{_exe}$/i;
}
正規表現に関連する特殊変数のほとんどは副作用です。 Perl はマッチングに成功したときにこれらの変数を設定するので、変数を 使う前にマッチングの結果をチェックするべきです。 例えば:
if( /P(A)TT(ER)N/ ) {
print "I found $1 and $2\n";
}
これらの変数は特に記さない限り読み込み専用で動的スコープを持ちます。
正規表現変数の動的な特性により、以下のコード片で示されているように、 変数の値はブロック内に制限されます:
my $outer = 'Wallace and Grommit';
my $inner = 'Mutt and Jeff';
my $pattern = qr/(\S+) and (\S+)/;
sub show_n { print "\$1 is $1; \$2 is $2\n" }
{
OUTER:
show_n() if $outer =~ m/$pattern/;
INNER: {
show_n() if $inner =~ m/$pattern/;
}
show_n();
}
出力から分かることは、OUTER
ブロックの間では $1
と $2
の値は $outer
に対するマッチングからのものになります。 INNER
ブロックの内側では、$1
と $2
の値は $inner
での マッチングからのものになりますが、ブロックの最後までです (つまり、 動的スコープを持ちます)。 INNER
ブロックの終了後、$1
と $2
の値は、他のマッチングがなくても $outer
に対するマッチングからのものになります:
$1 is Wallace; $2 is Grommit
$1 is Mutt; $2 is Jeff
$1 is Wallace; $2 is Grommit
Perl の実装における不幸な事故により、use English
は $`
, $&
, $'
を使うので、プログラム中の全ての 正規表現マッチングにおいてかなりの性能低下を引き起こします; これは use English
のスコープ内かどうかに関わりません。 この理由により、ライブラリで use English
を使うのは、マッチング変数を 使わずにインポートするのでない限りできるだけ避けてください。
use English '-no_match_vars'
Devel::NYTProf
モジュールと Devel::FindAmpersand
モジュールは コードの中でのこれらの問題のあるマッチング変数の仕様を探す助けになります。
Perl 5.10 から、/p
マッチングフラグと、 ${^PREMATCH}
, ${^MATCH}
, ${^POSTMATCH}
変数を代わりに使えて、 パフォーマンスのペナルティだけを受けます。
最後に成功したパターンマッチングで対応する括弧のサブパターンにマッチングした 文字列が入っているが、既に抜けてしまったブロックでの パターンマッチングは勘定に入れません。
これらの変数はすべて読み込み専用で、動的なスコープを持ちます。
記憶法: \(数字) のようなもの。
最後に成功したパターンマッチでマッチした文字列 (現在の BLOCK で囲まれた BLOCK や eval()
で隠れている部分でのマッチは 勘定に入れません)。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 このペナルティを避けるために、同じ部分文字列を "@-" を使って 抽出できます。 Perl 5.10 から、/p
マッチングフラグと ${^MATCH}
変数を 特定のマッチング演算子について同じことをするために使えます。
この変数は読み込み専用で動的スコープを持ちます。
記憶法: あるエディタの &
ようなもの。
これは $&
($MATCH
) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
この変数は Perl 5.10 で追加されました。
この変数は読み込み専用で動的スコープを持ちます。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入れません) で マッチした部分の前の文字列。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 このペナルティを避けるために、同じ部分文字列を "@-" を使って 抽出できます。 Perl 5.10 から、/p
マッチングフラグと ${^PREMATCH}
変数を 特定のマッチング演算子について同じことをするために使えます。
この変数は読み込み専用で動的スコープを持ちます。
記憶法: `
は多くの場合クォートされた文字列の前にある。
これは $`
($PREMATCH) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
この変数は Perl 5.10 で追加されました。
この変数は読み込み専用で動的スコープを持ちます。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入れない) で マッチした部分に続く文字列。 例:
local $_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # abc:def:ghi を表示
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 このペナルティを避けるために、同じ部分文字列を "@-" を使って 抽出できます。 Perl 5.10 から、/p
マッチングフラグと ${^POSTMATCH}
変数を 特定のマッチング演算子について同じことをするために使えます。
この変数は読み込み専用で動的スコープを持ちます。
記憶法: '
は多くの場合クォートされた文字列の後にある。
これは $'
($POSTMATCH
) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
この変数は Perl 5.10 で追加されました。
この変数は読み込み専用で動的スコープを持ちます。
最後に検索されたパターンの最後の括弧にマッチした文字列。 これはいくつかの選択肢の中でどれがマッチするのか わからないような場合に使うと便利です。 例えば:
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
この変数は読み込み専用で動的スコープを持ちます。
記憶法: ポジティブで前向き。
最近のマッチングに成功した検索パターンのうち、一番最近に閉じられた 使われたグループ(つまり、一番右の閉じかっこのグループ)にマッチングした テキスト。
これは主として最近マッチしたテキストを調べるために (?{...})
ブロックの 中で使われます。 例えば、($1
, $2
などに加えて) テキストを変数に効率的に捕捉するには、 (...)
を以下で置き換えます:
(?:(...)(?{ $var = $^N }))
$var
をこの方法で設定してから使うことで、かっこの組の番号について 気にしなくてすむようになります。
この変数は Perl 5.8 で追加されました。
記憶法: もっとも最近閉じられた、(おそらく) ネストした (Nested) かっこ。
この配列は、現在アクティブな動的スコープで最後に成功した部分マッチングの 最後へのオフセットを保持します。 $+[0]
はマッチ全体の文字列の最後へのオフセットです。 これはマッチした変数に対して pos
関数を呼び出したときの返り値と同じです。 この配列の n 番目の要素は n 番目のサブマッチのオフセットを 保持しているので、$+[1]
は過去の $1
の終わりのオフセット、$+[2]
は $2
のオフセット、という形になります。 $#+
は最後に成功したマッチでいくつサブグループがあるかを決定するのに 使えます。 @-
変数の例を参照して下さい。
この変数は Perl 5.6 で追加されました。
@+
と同様、%+
ハッシュは、現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉バッファ(存在すれば)へのアクセスを可能にします。
例えば、$+{foo}
は以下のマッチングの後の $1
と等価です:
'foo' =~ /(?<foo>foo)/;
%+
ハッシュのキーは捕捉された(従って定義された値と結びついている) バッファの名前のみの一覧です。
%+
の基礎となる振る舞いは Tie::Hash::NamedCapture モジュールで 提供されています。
注意: %-
and %+
は最後に成功した正規表現と関連付けられた共通の 内部ハッシュと tie されたビューです。 従って、each
経由で混ざった反復アクセスを行うと、予測不能の結果と なります。 同様に、最後に成功したマッチングを変更すると、結果は驚くべきものとなります。
この変数は Perl 5.10 で追加されました。
この変数は読み込み専用で動的スコープを持ちます。
$-[0]
は最後に成功したマッチの先頭のオフセットです。 $-[
n]
は n 番目のサブパターンにマッチした部分文字列の先頭の オフセットです; サブパターンがマッチしなかった場合は undef です。
従って $_
のマッチの後、$&
は substr $_, $-[0], $+[0] - $-[0]
と 一致します。 同様に、$n は、$-[n]
が定義されていれば substr $_, $-[n], $+[n] - $-[n]
と一致し、 $+ は substr $_, $-[$#-], $+[$#-] - $-[$#-]
と一致します。 $#-
は直前に成功したマッチで最後のマッチしたサブグループを 探すのに使えます。 正規表現でのサブグループの数である $#+
と対照的です。 @+
と比較してください。
この配列は現在アクティブな動的スコープ内で最後に成功した サブマッチの先頭位置のオフセットを保持します。 $-[0]
はマッチ全体の先頭の文字列へのオフセットです。 この配列の n 番目の要素は n 番目のサブマッチへの オフセットを保持しますので、$-[1]
は $1
の先頭への オフセット、$-[2]
は $2
の先頭へのオフセット、などとなります。
ある変数 $var
でマッチした後、以下のようになります。
$`
は substr($var, 0, $-[0])
と同じです$&
は substr($var, $-[0], $+[0] - $-[0])
と同じです$'
は substr($var, $+[0])
と同じです$1
は substr($var, $-[1], $+[1] - $-[1])
と同じです$2
は substr($var, $-[2], $+[2] - $-[2])
と同じです$3
は substr $var, $-[3], $+[3] - $-[3])
と同じですこの変数は Perl 5.6 で追加されました。
%+
と同様、この変数は現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉グループへのアクセスを可能にします。 正規表現中に捕捉グループ名が現れるごとに、その名前のグループ全てで (複数あるでしょう)捕捉されている値のリストを出現順で含む配列への リファレンスと関連付けられます。
以下は例です:
if ('1234' =~ /(?<A>1)(?<B>2)(?<A>3)(?<B>4)/) {
foreach my $bufname (sort keys %-) {
my $ary = $-{$bufname};
foreach my $idx (0..$#$ary) {
print "\$-{$bufname}[$idx] : ",
(defined($ary->[$idx])
? "'$ary->[$idx]'"
: "undef"),
"\n";
}
}
}
とすると、以下のものが表示されます:
$-{A}[0] : '1'
$-{A}[1] : '3'
$-{B}[0] : '2'
$-{B}[1] : '4'
%-
ハッシュのキーは正規表現で見つかった全てのバッファ名に対応します。
%-
の振る舞いは Tie::Hash::NamedCapture モジュールを使って 実装されています。
注意: %-
and %+
は最後に成功した正規表現と関連付けられた共通の 内部ハッシュと tie されたビューです。 従って、each
経由で混ざった反復アクセスを行うと、予測不能の結果と なります。 同様に、最後に成功したマッチングを変更すると、結果は驚くべきものとなります。
この変数は Perl 5.10 で追加されました。
この変数は読み込み専用で動的スコープを持ちます。
最後に成功した (?{ code })
正規表現アサートの評価の結果です (perlre を参照して下さい)。おそらくもっと書き足します。
この変数は Perl 5.005 で追加されました。
正規表現デバッグフラグの現在の値です。 0 をセットすると、re 'debug'
モジュールが読み込まれていてもデバッグ出力を 行いません。 詳細については re を参照してください。
この変数は Perl 5.10 で追加されました。
どれくらい正規表現の最適化を行い、どれくらいのメモリを利用するかを 制御します。 デフォルトではこの値は 65536 で、512kB の一時キャッシュに相当します。 この値を大きくすると、大きなものとマッチングするときに速度を重視して多くの メモリを使います。 もしできるだけ保守的なメモリ消費をするけれども使うこともある、というように 最適化したい場合は小さい値を設定します; 負の値を設定すると最適化は行わず、 最大限メモリを節約します。 通常の状況では、この変数はあなたの興味を引くものではないでしょう。
この変数は Perl 5.10 で追加されました。
現在選択されているファイルハンドルに依存する変数の場合には、代わりに IO::Handle
オブジェクトに関するオブジェクトメソッドを呼び出して 設定できますが、通常の組み込み変数よりは効率が落ちます。 (以下の要約では HANDLE という語を含んでいます。) まず最初に必ず、
use IO::Handle;
と書き、その後で以下のように書くか、
method HANDLE EXPR
もしくはより安全に以下のように書きます:
HANDLE->method(EXPR)
それぞれのメソッドは、IO::Handle
属性の昔の値を返します。 メソッドはそれぞれ EXPR をとることができ、指定した場合には、問題の IO::Handle
属性の新しい値を指定することになります。 指定しない場合には、多くのメソッドでは現在の値に対して何もしませんが、 autoflush()
では 1 を指定されたものとします。
IO::Handle
クラスを読み込むのはコストの高い操作なので、 通常の組み込み変数の使い方を覚えるべきです。
これらの変数のいくつかは「読み込み専用」と考えられます。 つまり、もしこの変数に対して直接またはリファレンスを通して間接に 代入しようとすると、、実行時エラーが発生します。
この文書に記述されているほとんどの特殊変数のデフォルト値を変更するときには とても慎重になるべきです。 ほとんどの場合、これらの変数を変更する前にこれらをローカル化したいでしょう; さもなければ、あなたが変更した特殊変数のデフォルト値に依存している その他のモジュールにも影響を与えるかもしれないからです。 これはファイル全体を一度に読み込む正しい方法の一つです:
open my $fh, "<", "foo" or die $!;
local $/; # ローカル化された吸い込みモードを有効にする
my $content = <$fh>;
close $fh;
しかし以下のコードは完全に悪いものです:
open my $fh, "<", "foo" or die $!;
undef $/; # 吸い込みモードを有効にする
my $content = <$fh>;
close $fh;
なぜなら、その他のモジュールでは、デフォルトの「行モード」でファイルを 読もうとするかも知れませんが、もし単に前述のコードを実行すると、 $/
のグローバルな値が、同じ Perl インタプリタ内で実行される その他のコードに対しても変更されるからです。
通常、変数をローカル化するとき、この変更ができるだけ最短のスコープに 影響を与えることを確実にしたいでしょう。 従って、既に小さい {}
ブロックの内側であるのでない限り、それを 自身で作るべきです。 例えば:
my $content = '';
open my $fh, "<", "foo" or die $!;
{
local $/;
$content = <$fh>;
}
close $fh;
以下はどのように自分のコードが壊れるかの例です:
for ( 1..3 ){
$\ = "\r\n";
nasty_break();
print "$_";
}
sub nasty_break {
$\ = "\f";
# $_ で何かする
}
おそらくこのコードは以下のように表示されることを期待しています:
"1\r\n2\r\n3\r\n"
しかし、以下のようになります:
"1\f2\f3\f"
なぜでしょう? nasty_break()
は $_
をローカル化する前に変更するからです。 nasty_break()
で設定した値は戻ったときにまだそこにあります。 修正するには、local()
を追加して、値が nasty_break()
の外に 漏れないようにします:
local $\ = "\f";
このような短い例では問題に気付くのは簡単ですが、より複雑なコードでは、 もし特殊変数の変更をローカル化していないと問題を探すことになります。
<>
から読込みを行なっているとき、その時点のファイル名を示します。
配列 @ARGV
は、コマンドラインからスクリプトに渡す引数が入れられます。 $ARGV[0]
がプログラムのコマンド名自身ではなく、 最初の引数ですから、$#ARGV
は一般には、引数の個数 - 1 となります。 コマンド名については、"$0" を参照してください。
@ARGV
にあるコマンドラインで指定されたファイル名に対して反復する 特殊ファイルハンドルです。 通常角かっこ <>
の中で空ファイルハンドルとして書かれます。 現在のところ、ARGV
は <>
演算子の中でのみ特別な効果があることに 注意してください; その他の場所では、<>
で開かれた最後のファイルに 対応する普通のファイルハンドルです。 特に、ファイルハンドルを想定している関数に \*ARGV
を引数として渡しても、 関数内で @ARGV
にある全てのファイルの内容を自動的に読み込むことには なりません。
-i を使ってその場修正を行っているときに、現在開いている出力ファイルを 示す特殊ファイルハンドルです。 たくさんの挿入をする必要があるときに $_
を修正し続けたくない場合に 有用です。 -i オプションについては perlrun を参照してください。
print 演算子のための出力フィールドセパレータ。 定義されると、この値がそれぞれの print の引数の間に表示されます。 デフォルトは undef
です。
記憶法: print 文で "," を書いた場所に印字されるもの。
最後にアクセスされたファイルハンドルの現在の行番号。
Perl の各ファイルハンドルは、そこから読み込んだ行数を数えています。 ($/
の値に依存して、何が行を構成するかに関する Perl の考えはあなたの 考えと一致しないかもしれません。) 行が(readline()
や <>
を使って)ファイルハンドルから読み込まれたか、 tell()
や seek()
がファイルハンドルに対して呼び出された場合、 $.
はそのファイルハンドルの行カウンタへのエイリアスとなります。
$.
へ代入することでカウンタの値を修正できますが、これは実際にシーク ポインタを動かすことはありません。 $.
をローカル化してもファイルハンドルの行カウンタは ローカル化されません。 代わりに、現在 $.
がどのファイルハンドルへのエイリアスかという情報が ローカル化されます。
$.
はファイルハンドルがクローズされるとリセットされますが、 オープンしているファイルハンドルが close()
されることなく再オープンされた 場合にはリセット されません。 さらなる詳細については、"I/O Operators" in perlop を参照してください。 なぜなら、 <>
は決して明示的なクローズは行わず、行番号は ARGV
の ファイル間で通算してカウントされるからです(但し "eof" in perlfunc の例を 参照してください)。
また、HANDLE->input_line_number(EXPR)
とすることで、どのハンドルに 最後にアクセスしたかを気にすることなく行カウンタにアクセスできます。
記憶法: 多くのプログラムで "." が現在行番号を示すように使われています。
入力レコードセパレータで、デフォルトでは改行文字。 これは Perl での「行」とは何か、ということに影響を与えます。 空文字列に設定されると、空行をセパレータとして扱うことを 含めて、awk の変数 RS のように働きます (空行はスペースやタブを含んでいてはいけません)。 複数文字の区切文字を示すために、文字列を設定することもできます; また、 ファイルの最後まで読み込むために undef を指定することもできます。 この変数に "\n\n"
を設定すると、空行が続く場合において、 ""
を設定した場合とわずかに違う動作をするようになります。 ""
を設定した場合には、複数の空行も 1 つの空行であるかのように扱います。 "\n\n"
を設定した場合には、単純に次の文字が (たとえ改行文字であっても) 次の段落に含まれるものとして扱います。
local $/; # 「吸い込み」モードを有効にする
local $_ = <FH>; # ファイル全体が入る
s/\n[ \t]+/ /g;
注意: $/
は文字列であり、正規表現ではありません。 awk は何かもっとうまくやらなくてはいけません。:-)
$/
に整数、整数を含むスカラ、整数に変換できるスカラのいずれかへの リファレンスをセットすると、行を読む代わりにレコードを読もうとします; この場合、最大レコードサイズはリファレンス先の整数値となります。 つまり:
local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;
これは FILE から 32768 バイトを超えないようにレコードを読み込みます。 もしレコード指向のファイルを読み込まない場合 (あるいは OS がレコード指向ファイルを持たない場合)、 読み込み毎にデータのチャンク全部を取り込みます。 もしレコードがセットしたレコードサイズより大きい場合、 レコードの部分を取り込みます。 レコードサイズを 0 以下にセットしようとすると、(残りの)ファイル全体を 読み込むことになります。
VMS だけでは、レコードは PerlIO 層とそれに関連するバッファリングを迂回して 読み込まれるので、同じファイルハンドルでレコード読み込みと 非レコード読み込みを混ぜてはいけません。 レコードモードは、同じバッファリング層を両方のモードで使う場合にのみ ラインモードと混ざります。
:encoding(latin1)
や :utf8
のようなエンコーディング層を使って FILE からレコード読み込みを実行する場合、結果として不正な文字列を 得ることになったり、FILE がストリーム中の文字の途中の位置になったり、 基となる指定したファイルからバイト数を読み込めなかったりするかも しれません。 この振る舞いは将来のバージョンの perl では警告なしに 変更されるかもしれません。
"Newlines" in perlport を参照してください。 "$." も参照してください。
記憶法: /は、詩を引用するときに、行の区切りを示します。
print 演算子のための出力レコードセパレータ。 もし定義されていると、print の最後の引数の最後にこの値が表示されます。 デフォルトは undef
です。
記憶法: print の最後に "\n" を付け加える代わりに $\
を設定する。 また、$/
に似通っているが、Perl から「バック」されるものです。
0 以外に設定されると、 その時点で選択されている出力チャネルを 直ちにその場でフラッシュし、 さらに write や print を行なうごとに、強制的にフラッシュします。 デフォルトでは 0 となっています (チャンネルが実際にシステムによってバッファリングされているかどうかは 関知しません。$|
は Perl が明示的に毎回書き込みの後に フラッシュするかどうかのみを示します)。 STDOUT は通常では、端末への出力時には行バッファリング、 それ以外ではブロックバッファリングであることに注意してください。 これは、Perl のスクリプトを rsh 配下で実行して、 実行状況を確認したい場合のように、パイプやソケットに出力するときに特に 便利でしょう。 これは入力バッファリングには何の影響も与えません。 出力チャネルの選択方法については "select" in perlfunc を参照してください。 IO::Handle も参照してください。
記憶法: パイプをホットな状態にしておくために使う。
フォーマットのための特殊変数はファイルハンドルのための物のサブセットです。 Perl のフォーマットに関するさらなる情報については perlform を 参照してください。
format()
行のための、その時点での write()
アキュムレータの値。 format には、$^A
に結果を残す、formline()
呼び出しが含まれます。 自分のフォーマットを呼び出した後で、 write()
は $^A
の内容を出力してから消去します。 したがって、自分で formline()
を呼び出すのでなければ、 $^A
の値が見えることはありません。 perlform と "formline PICTURE,LIST" in perlfunc を参照してください。
フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f
。
その時点で選択されている出力チャネルの、その時点でのページ番号。
記憶法: %
は、nroff でのページ番号です。
その時点で選択されている出力チャネルの、ページに残っている行数。
記憶法: "ページ行数" - "印字済み行数"
フォーマットの充填継続フィールド (^
で始まるもの) への文字列で行分割を許す 文字集合。 デフォルトは " \n-" で空白、改行、ハイフンの後で行分割が可能です。
記憶法: 詩では「コロン」は、行の一部。
その時点で選択されている出力チャネルの、その時点でのページ長 (印字可能行数)。 デフォルトは 60 です。
記憶法: = には複数の水平線 (行) が含まれます。
その時点で選択されている出力チャネルの、その時点でのページ先頭 フォーマット名。 デフォルトは、ファイルハンドル名に _TOP を続けたものです。 例えば、STDOUT
ファイルハンドルのデフォルトのページ先頭フォーマット名は STDOUT_TOP
です。
記憶法: ページの先頭へのポインタ。
その時点で選択されている出力チャネルの、その時点でのフォーマット名。 デフォルトは、ファイルハンドル名です。 例えば、STDOUT
ファイルハンドルのデフォルトフォーマット名は 単に STDOUT
です。
記憶法: $^
の兄弟。
変数 $@
, $!
, $^E
, $?
は Perl プログラムの実行中に 発生した、異なる種類のエラー情報を保持します。 変数はエラーを報告した副システムと Perl プロセスとの「距離」 の順番に並んでいます。 これらはそれぞれ、Perl インタプリタ、C ライブラリ、 オペレーティングシステム、外部プログラムによって検出された エラーに対応しています。
これらの変数の違いを示すために、 以下のようなシングルクォートを用いた Perl 式を考えます。 この文の実行後、perl は四つ全ての特殊エラー変数をセットします:
eval q{
open my $pipe, "/cdrom/install |" or die $!;
my @res = <$pipe>;
close $pipe or die "bad pipe: $?, $!";
};
eval()
式が実行されたとき、open()
, <PIPE>
, close
は C ランタイムライブラリの呼び出しに変換され、それからオペレーティング システムコールに変換されます。 $!
はこれらの呼び出しのどれかが失敗したとき、 C ライブラリの errno
の値がセットされます。
$@
は eval
された文字列がコンパイルされなかったとき (これは open
か close
が正しくない プロトタイプでインポートされたときに起こり得ます)、 または評価中に実行している Perl コードが die()
したときにセットされます。 これらの場合には $@
の値はコンパイルエラー、または die
への引数(これには $!
と $?
が差し挟まれます)です。 (しかし、Fatal も参照して下さい。)
いくつかのオペレーティングシステムでは、$^E
により詳細なエラー指示子が 入っているかもしれません; 今回の場合で言えば、 "CDROM tray not closed." などです。 追加のエラーメッセージに対応していないシステムでは、$^E
は $!
と同じ 値です。
最後に、$?
は外部プログラム /cdrom/install が失敗したときに 非 0 にセットされるかもしれません。 上位の 8 ビットはプログラムが遭遇した特定のエラー状況 (プログラムの exit()
の値)を反映します。 下位の 8 ビットは、シグナルの死亡やコアダンプ情報と言った失敗のモードを 反映します。 詳細については wait(2) を参照して下さい。 $!
と $^E
はエラー状況が検出されたときにのみ設定されますが、 変数 $?
は wait
やパイプの close
の度に、前の値を上書きします。 これは、$@
が eval()
の実行毎に、エラーならセットされ、 成功ならクリアされるという動作と似ています。
より詳細については、$@
, $!
, $^E
, $?
それぞれの説明を 参照して下さい。
最後のパイプクローズ、逆クォート (``
) コマンド、wait()
と waitpid()
の成功した呼び出し、system()
演算子から返された、 ネイティブなステータスです。 POSIX 風システムでは、この値は POSIX モジュールで提供される WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED 関数でデコードできます。
VMS ではこれは実際の VMS の終了ステータスを反映します; 言い換えると、これは use vmsish 'status'
プラグマが有効なときの $? と 同じです。
この変数は Perl 5.8.9 で追加されました。
現在のオペレーティングシステムに特化したエラー情報です。 現在のところ、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
にも適用されます。
この変数は Perl 5.003 で追加されました。
記憶法: 追加の(Extra)エラーの説明。
現在のインタプリタの状態を示します。
$^S 状態
--------- -------------------
undef モジュール/eval のパース中
真 (1) eval の実行中
偽 (0) その他
最初の状態は $SIG{__DIE__}
と $SIG{__WARN__}
のハンドラで起きる 可能性があります。
この変数は Perl 5.004 で追加されました。
警告スイッチの値で、-w スイッチが使われると内部的に真となり、 そうでない場合は直接変更可能です。
warnings も参照して下さい。
記憶法: -w スイッチに関係します。
use warnings
プラグマで有効にされた、現在の警告チェックの集合です。 $^H
および %^H
変数と同じスコープを持ちます。 正確な値は warnings プラグマの内部の値と考えられ、Perl の バージョンによって変更されるかもしれません。
この変数は Perl 5.6 で追加されました。
参照されると、$!
は C の errno
正数変数の現在の値を取得します。 $!
に数値が代入されると、その値は errno
に補完されます。 文字列として参照されると、$!
は errno
に対応するシステムエラー 文字列を返します。
多くのシステムやライブラリ呼び出しは、失敗したときに、失敗の理由を示すために errno
を設定します。 これらは普通は成功したときには errno
にゼロを設定 しません。 これは、errno
、$!
は、失敗 の 直後 でのみ意味が あるということです:
if (open my $fh, "<", $filename) {
# ここで $! は無意味。
...
}
else {
# ここでだけ $! に意味がある。
...
# ここで既に $! は無意味かもしれません。
}
# ここでは成功と失敗の両方の可能性があるので、
# $! は無意味。
ここで、無意味 というのは $!
は open()
演算子の結果に 関係ないということです。 $!
への代入も同様に一時的なものです。 これは、終了値を設定したり、エラー n に対応するシステムエラー文字列を 調べたり、$!
を意味のある状態に復元するために、die()
演算子を 起動する直前で使えます。
記憶法: 何が bang(!) したか。
%!
の各要素は、$!
がその値にセットされている場合にのみ真の値を 持ちます。 例えば、$!{ENOENT}
は、現在の $!
の値が ENOENT
の場合にのみ 真となります; これは、最近のエラーが "No such file or directory" (あるいは倫理的に等価なもの: 全ての OS が正確に 同じエラーを出すわけではないですし、全ての言語で出るわけでもありません) の 場合です。 あなたのシステムで特定のキーが意味があるかどうかを調べるには、 exists $!{the_key}
を使ってください; 有効なキーのリストを得るには、 keys %!
としてください。 さらなる情報に関しては Errno と /$!
を参照してください。
この変数は Perl 5.005 で追加されました。
最後に close したパイプ、バッククォート (``
) コマンド、 成功した wait()
または waitpid() 呼び出し、system()
演算子が返した ステータス。 このステータスワードは伝統的な Unix の wait()
システムコールが返した 16 ビットのステータス(またはそのように見えるもの)です。 従ってサブプロセスの exit 値は、実際には ($? >> 8
) で、$? & 127
は、もしあれば、そのプロセスを止めたシグナルで、 $? & 128
はコアダンプがあるかどうかを示します。
さらに、C で h_errno
変数に対応している場合は、 gethost*()
が失敗したときに $?
を通して返されます。
SIGCHLD
のシグナルハンドラを設定した場合、 $?
の値は通常ハンドラの外側では正しくない値となります。
END
サブルーチンの内側では $?
には exit()
に渡されようとしている 値を含みます。 プログラムの終了ステータスを変更するために、END
サブルーチン 内で $?
を変更できます。 例えば:
END {
$? = 1 if $? == 255; # die は 255
}
VMS では、use vmsish 'status'
を指定すると、 $?
はPOSIX ステータスをエミュレートしたものではなく、 実際の VMS 終了ステータスを反映します; 詳細は "$?" in perlvms を 参照してください。
記憶法: sh や ksh と同様。
最後の eval()
操作子による Perl の構文エラーメッセージです。 $@
が空文字列であれば、最後の eval()
が正常に 解析され、実行されたことになります (が、実行した演算子が、 通常の意味で失敗しているかもしれません)。
警告メッセージはこの変数に入りません。 しかし、"%SIG" に記述されている $SIG{__WARN__}
にセットすることで 警告を処理するルーチンを設定できます。
記憶法: どこで ("at") 構文エラーが起ったか。
これらの変数は現在のインタプリタの状態に関する情報を提供します。
-c スイッチに関連付けられた現在の値です。 主に -MO=... と共に用いられ、例えば AUTOLOAD
を通常の遅延ロードでは なくコンパイル時に実行するといった、コンパイル時の振る舞いを 変えるために用います。 $^C = 1
に設定することは B::minus_c
を呼び出すのと似ています。
この変数は Perl 5.6 で追加されました。
デバッグフラグの現在の値を示します。 読み書き可能です。 コマンドラインによる等価な機能と同様に、数値とシンボル値が使えます (例: $^D = 10
または $^D = "st"
)。
記憶法: -D スイッチの値。
ソースコードを Unicode に変換するために使われる Encode
オブジェクトへの オブジェクトリファレンス 。 この変数のおかげで、Perl スクリプトを UTF-8 で書く必要がありません。 デフォルトは undef です。 この変数を直接操作することはとても推奨できません。
この変数は Perl 5.8.2 で追加されました。
perl インタプリタの現在のフェーズ。
取り得る値は:
PerlInterpreter*
は perl_construct
で構築されます。 この変数はほとんど完全性のためと、基礎となっている C 変数 PL_phase
経由での使用のために存在しています。 実際にはインタプリタの構築が完了しない限り Perl コードを 実行することはできません。
これはコンパイル時にグローバルです。 これは基本的に、直接実行されたり、トップレベルプログラムの コンパイル時の間に間接的に実行される全ての BEGIN
です。
BEGIN
ブロックとの混乱を避けるために、このフェーズの名前は "BEGIN" では ありません; これらは単にトップレベルプログラムではなく、任意のコンパイル ユニットのコンパイル中に実行されます。 例えば eval "use SomeModule"
のように、実行時に入った 新しいローカル化されたコンパイル時はグローバルなインタプリタフェーズではなく、 従って ${^GLOBAL_PHASE}
に反映されません。
CHECK
ブロックの実行。
"CHECK" と似ていますが、CHECK
ブロックではなく INIT
ブロック。
メインの実行; つまり PL_main_root
の実行。
END
ブロックの実行。
グローバルなデストラクタ。
また、UNITCHECK ブロックのための値はないことに注意してください。 なぜなら、これらはコンパイルユニット毎に独立に実行され、従って グローバルなインタプリタフェーズではないからです。
全てのプログラムが可能な全てのフェーズを通らなければならないわけでは ありませんが、あるフェーズから他のフェーズへの移行は上述の 順でのみ起こります。
Perl コードの全てのフェーズを見る例です:
BEGIN { print "compile-time: ${^GLOBAL_PHASE}\n" }
INIT { print "init-time: ${^GLOBAL_PHASE}\n" }
CHECK { print "check-time: ${^GLOBAL_PHASE}\n" }
{
package Print::Phase;
sub new {
my ($class, $time) = @_;
return bless \$time, $class;
}
sub DESTROY {
my $self = shift;
print "$$self: ${^GLOBAL_PHASE}\n";
}
}
print "run-time: ${^GLOBAL_PHASE}\n";
my $runtime = Print::Phase->new(
"lexical variables are garbage collected before END"
);
END { print "end-time: ${^GLOBAL_PHASE}\n" }
our $destruct = Print::Phase->new(
"package variables are garbage collected after END"
);
これは以下のものを出力します:
compile-time: START
check-time: CHECK
init-time: INIT
run-time: RUN
lexical variables are garbage collected before END: RUN
end-time: END
package variables are garbage collected after END: DESTRUCT
この変数は Perl 5.14.0 で追加されました。
警告: この変数は厳密に内部使用に限定されます。 その可用性、挙動、内容は告知なく変更される可能性があります。
この変数には 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 { add_100() }
ブロックを以下のように変更すると:
BEGIN { require strict; strict->import('vars') }
どのように use strict 'vars'
が実装されているかがわかります。 以下は同じレキシカルプラグマの条件付き版です:
BEGIN {
require strict; strict->import('vars') if $condition
}
この変数は Perl 5.003 で追加されました。
%^H
ハッシュは $^H
と同じスコープを持ちます。 これはレキシカルスコープを持つプラグマを実装するのに便利です。 perlpragma を参照してください。
%^H
に追加するとき、他のハッシュのユーザーとの衝突を回避するために、 キーの使い方に関する慣習があります。 モジュールはモジュールの名前(主なパッケージの名前)と "/" 文字で始まる キーのみを使うべきです。 例えば、モジュール Foo::Bar
は Foo::Bar/baz
のようなキーを 使うべきです。
この変数は Perl 5.6 で追加されました。
PerlIO で使われる内部変数です。 文字列は \0
で分割された二つの部分からなり、前半は入力層を、 後半は出力層を示します。
この変数は Perl 5.8.0 で追加されました。
デバッグ機能のための内部変数です。 それぞれのビットの意味は変わるかもしれませんが、 現在のところは以下の通りです:
サブルーチンの出入りをデバッグします。
行毎にデバッグします。 各行を実行する毎に DB::DB()
サブルーチンを呼び出します。 さらに、(0x400 のように) ソースコードを保存します。
最適化を行いません。
将来の対話的な検査のためにより多くのデータを保存します。
サブルーチンが定義されたソース行に関する情報を保持します。
シングルステップ実行で開始します。
報告時にサブルーチン名でなくサブルーチンのアドレスを使います。
goto &subroutine
も同様に報告します。
eval に対して、コンパイルされた位置を元にした「ファイル」名を提供します。
無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。
ソースコードの行数を @{"_<$filename"}
に保存します。
一部のビットはコンパイル時にのみまたは実行時にのみ意味があります。 これは新しい機構であり、詳細は変更されるかもしれません。 perldebguts も参照してください。
汚染検査モードのオン・オフを反映します。 1 はオン(プログラムは -T 付きで実行されている)、0 はオフ、-1 は汚染 警告のみが有効になっている(つまり -t か -TU)ことを意味します。
この変数は読み込み専用です。
この変数は Perl 5.8 で追加されました。
Perl のいくつかの Unicode 設定を反映します。 設定できる値に関するさらなる情報については perlrun の -C
オプションを 参照してください。
この変数は Perl 起動時に設定され、その後は読み込み専用です。
この変数は Perl 5.8.2 で追加されました。
この変数は内部 UTF-8 オフセットキャッシュコードの状態を制御します。 1 はオン(デフォルト)、0 はオフ、-1 は全ての結果を線形走査と比較して、 矛盾があれば異常終了する、という形でキャッシュコードをデバッグします。
この変数は Perl 5.8.9 で追加されました。
この変数は、起動時に perl によって UTF-8 ロケールが検出されたかどうかを 示します。 この情報は(-CL
コマンドラインスイッチで起動されることによって) 「utf8 性をロケールに合わせる」モードのときに perl によって使われます; これに関するさらなる情報は perlrun を参照してください。
この変数は Perl 5.8.8 で追加されました。
非推奨となった変数は、perl のメンテナが最終的にこの変数を 削除するということを意図して通知されます。 その状態にも関わらず、まだ利用可能です。 非推奨となった変数を使うと警告が出ます。
変数が削除された後で変数を使うと、この変数が非対応となったことを 知らせるエラーが出ます。
エラーメッセージの詳細については perldiag を参照してください。
$#
は、表示番号をフォーマットするために使われていました。 非推奨化の後、このマジックは Perl 5.10 で取り除かれ、警告を 引き起こします: $# is no longer supported
.
これは $#array
のように最後のインデックスを得るために配列名の前に付ける 印ではありません。 これは今でも Perl で配列の最後のインデックスを得る方法です。 これら二つには互いに何の関係もありません。
Perl 5 で非推奨となりました。
Perl 5.10 で削除されました。
$*
は複数行マッチングを有効にするために使われていた変数です。 非推奨化の後、このマジックは Perl 5.10 で削除されました。 これを使うと警告を引き起こします: $* is no longer supported
。 代わりに /s
と /m
の正規表現修飾子を使うべきです。
Perl 5 で非推奨となりました。
Perl 5.10 で削除されました。
この変数は配列の最初の要素や、文字列の最初の文字のインデックスを 保管します。 デフォルトは 0 ですが、理論的には、index() 関数や substr() 関数を評価するときに、Perl の動作をより awk (や Fortran) に近づけるため、1 に設定することもできます。
Perl 5 からは $[
への代入は、コンパイラ指示子として扱われ、 他のファイルの動作に影響を与えることがなくなりました。 (これが、コンパイル時定数しか代入できない理由です。) この変数の使用は非推奨です。
Perl 5.10 より前では、$[
は(strict のような)その他のコンパイル時 指示子と異なり、同じファイルのレキシカルスコープの外側から見ることが 出来ていました。 これに local() を使うとこの値を厳密にレキシカルスコープの内側に限定します。 今では常にレキシカルスコープを持ちます。
Perl 5.16 から、これは arybase モジュールで実装されています。 この振る舞いに関するさらなる詳細については arybase を参照してください。
use v5.16
または no feature "array_base"
の基では、$[
は もはや何の効果もなく、常に 0 が入っています。 これに 0 を代入することは許されますが、それ以外の値はエラーを引き起こします。
記憶法: [ は添え字付けの始め。
Perl 5.12 で非推奨となりました。
正確な文字列比較ができる、より近代的な Perl バージョンの表現については "$^V" を参照してください。
Perl インタプリタの version + patchlevel / 1000 が返されます。 スクリプトの最初で、そのスクリプトを実行しているインタプリタのバージョンが 適切な範囲内にあるかを調べる、といったことができます:
warn "No checksumming!\n" if $] < 3.019;
浮動小数点表現は数値比較が不正確になることがあります。
実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSION
と require VERSION
のドキュメントも 参照して下さい。
記憶法: Perl のバージョンは、正しい範囲 (right bracket) にあるか。