perlvar - Perl で定義済みの変数
以下の名前は Perl では特別な意味を持ちます。 記号的な名前の多くは記憶法があるか、シェルでの類推が可能です。 それでも長い名前を使用したい場合には
use English;
とプログラムの最初に書いてください。 これは、すべての短い名前の別名として、 カレントパッケージで長い名前を付けるものです。 awk から持ってきた中間的な名前を持っているものもあります。 一般的に、一番良い使い方は:
use English '-no_match_vars';
と起動することで($PREMATCH, $MATCH, $POSTMATCH が不要の場合)、これにより 正規表現を使うときのパフォーマンスへの打撃を避けられます。 English を参照してください。
現在選択されているファイルハンドルに 依存する変数の場合には、代わりに IO::Handle オブジェクトに 関するオブジェクトメソッドを呼び出して設定することができますが、 通常の組み込み変数よりは効率が落ちます。 (以下の要約では HANDLE という語を含んでいます。) まず最初に必ず、
use IO::Handle;
と書き、その後で以下のように書くか、
method HANDLE EXPR
もしくはより安全に以下のように書きます:
HANDLE->method(EXPR)
それぞれのメソッドは、IO::Handle 属性の昔の値を返します。 メソッドはそれぞれ EXPR をとることができ、指定した場合には、 問題の IO::Handle 属性の新しい値を指定することになります。 指定しない場合には、多くのメソッドでは現在の値に対して何もしませんが、 autoflush() では 1 を指定されたものとします。
IO::Handle クラスを読み込むのはコストの高い操作なので、 通常の組み込み変数の使い方を覚えるべきです。
これらの変数の中には "read-only" として扱われるものもあります。 つまり、そういった変数に対して、直接にしろ、リファレンスを 介して間接にしろ、代入を行なおうとした場合には、実行時に 例外処理が起動されます。
この文書に記述されているほとんどの特殊変数のデフォルト値を変更するときには とても慎重になるべきです。 ほとんどの場合、これらの変数を変更する前にこれらをローカル化したいでしょう; さもなければ、あなたが変更した特殊変数のデフォルト値に依存している その他のモジュールにも影響を与えるかもしれないからです。 これはファイル全体を一度に読み込む正しい方法の一つです:
open my $fh, "<", "foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;
しかし以下のコードは完全に悪いものです:
open my $fh, "<", "foo" or die $!;
undef $/; # enable slurp mode
my $content = <$fh>;
close $fh;
なぜなら、その他のモジュールでは、デフォルトの「行モード」でファイルを 読もうとするかも知れませんが、もし単に前述のコードを実行すると、 $/
のグローバルな値が、同じ Perl インタプリタ内で実行される その他のコードに対しても変更されるからです。
通常、変数をローカル化するとき、この変更ができるだけ最短のスコープに 影響を与えることを確実にしたいでしょう。 従って、既に小さい {}
ブロックの内側であるのでない限り、それを 自身で作るべきです。 例えば:
my $content = '';
open my $fh, "<", "foo" or die $!;
{
local $/;
$content = <$fh>;
}
close $fh;
以下はどのように自分のコードが壊れるかの例です:
for (1..5){
nasty_break();
print "$_ ";
}
sub nasty_break {
$_ = 5;
# do something with $_
}
おそらくこのコードは以下のように表示されることを期待しています:
1 2 3 4 5
しかし、以下のようになります:
5 5 5 5 5
なぜでしょう? nasty_break() は $_
をローカル化する前に変更するからです。 修正するには、local() を追加します:
local $_ = 5;
このような短い例では問題に気付くのは簡単ですが、より複雑なコードでは、 もし特殊変数の変更をローカル化していないと問題を探すことになります。
以下のリストはまずスカラ変数、それから配列、ハッシュの順に 並んでいます。
デフォルトの入力とパターン検索のスペース。 以下の 2つは同値です:
while (<>) {...} # equivalent only in 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, 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.9.1 から、ファイルやブロックで my
で宣言することで、 レキシカル版の $_
が使えます。 さらに、our $_
という宣言は現在のスコープでグローバルな $_
を 再構築します。
(記憶法: 下線はある操作を覚えるためのもの。)
sort() を使うときの特殊パッケージ変数です; "sort" in perlfunc を 参照してください。 この特殊性により、$a と $b は、たとえ strict 'vars'
を使っているときでも (use vars や our() を使って) 宣言する必要がありません。 これを sort() 比較ブロックや関数で使えるようにしたい場合は、 my $a
や my $b
としてレキシカル化しないでください。
最後に成功したパターンマッチングで対応する括弧のサブパターンにマッチングした 文字列が入っているが、既に抜けてしまったブロックでの パターンマッチングは勘定に入れません。 (記憶法: \(数字) のようなもの。) これらの変数はすべて read-onlyで、現在の BLOCK に動的なスコープを持ちます。
最後に成功したパターンマッチでマッチした文字列 (現在の BLOCK で囲まれた BLOCK や eval() で隠れている部分でのマッチは 勘定に入れない)。 (記憶法: あるエディタの & ようなもの。) この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 "BUGS" を参照して下さい。
置き換えのためには "@-" を参照してください。
これは $&
($MATCH
) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入れない) で マッチした部分の前の文字列。 (記憶法: `
は多くの場合クォートされた文字列の前にある。) この変数は read-only です。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 "BUGS" を参照して下さい。
置き換えのためには "@-" を参照してください。
これは $`
($PREMATCH) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入れない) で マッチした部分に続く文字列。 (記憶法: '
は多くの場合クォートされた文字列の後にある。) 例:
local $_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # prints abc:def:ghi
この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 "BUGS" を参照して下さい。
置き換えのためには "@-" を参照してください。
これは $'
($POSTMATCH
) と同様ですが、この変数と関連付けられた性能上の ペナルティを被らず、パターンが /p
修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。
最後に検索されたパターンの最後の括弧にマッチした文字列。 これはいくつかの選択肢の中でどれがマッチするのか わからないような場合に使うと便利です。たとえば:
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
(記憶法: ポジティブで前向き。) この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
最近のマッチングに成功した検索パターンのうち、一番最近に閉じられた 使われたグループ(つまり、一番右の閉じかっこのグループ)にマッチングした テキスト。 (記憶法: もっとも最近閉じられた、(おそらく) ネストした (Nested) かっこ。)
これは主として最近マッチしたテキストを調べるために (?{...})
ブロックの 中で使われます。 例えば、($1
, $2
などに加えて) テキストを変数に効率的に捕捉するには、 (...)
を以下で置き換えます:
(?:(...)(?{ $var = $^N }))
$var
をこの方法で設定してから使うことで、かっこの組の番号について 気にしなくてすむようになります。
この変数は現在の BLOCK に動的なスコープを持ちます。
この配列は、現在アクティブな動的スコープで最後に成功した サブマッチの最後へのオフセットを保持します。 $+[0]
はマッチ全体の文字列の最後へのオフセットです。 これはマッチした変数に対して pos
関数を呼び出したときの 返り値と同じです。 この配列の n 番目の要素は n 番目のサブマッチのオフセットを 保持していますので、$+[1]
は過去の $1 の終わりのオフセット、 $+[2]
は $2 のオフセット、という形になります。 $#+
は最後に成功したマッチでいくつサブグループがあるかを 決定するのに使えます。 @-
変数の例を参照して下さい。
@+
と同様、%+
ハッシュは、現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉バッファ(存在すれば)へのアクセスを可能にします。
例えば、$+{foo}
は以下のマッチングの後の $1
と等価です:
'foo' =~ /(?<foo>foo)/;
%+
ハッシュのキーは捕捉された(従って定義された値と結びついている) バッファの名前のみの一覧です。
%+
の基礎となる振る舞いは Tie::Hash::NamedCapture モジュールで 提供されています。
注意: %-
and %+
は最後に成功した正規表現と関連付けられた共通の 内部ハッシュと tie されたビューです。 従って、each
経由で混ざった反復アクセスを行うと、予測不能の結果と なります。 同様に、最後に成功したマッチングを変更すると、結果は驚くべきものとなります。
最後にアクセスされたファイルハンドルの現在の行番号。
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 $/; # enable "slurp" mode
local $_ = <FH>; # whole file now here
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 では、レコード読み込みは sysread
と等価に行われますので、 レコード読み込みと非レコード読み込みを同じファイルで混ぜないのが 最善です。(これはあまり問題になりません。なぜなら レコード読み込みしたいファイルは多分行モードでは使えないものだからです。) VMS 以外のシステムでは普通の I/O を使いますので、 同じファイルのレコード読み込みと非レコード読み込みを混ぜても安全です。
"Newlines" in perlport と $.
も参照してください。
0 以外に設定されると、 その時点で選択されている出力チャネルを 直ちにその場でフラッシュし、 さらに write や print を行なうごとに、強制的にフラッシュします。 デフォルトでは 0 となっています (チャンネルが実際にシステムによってバッファリングされているかどうかは 関知しません。$|
は Perl が明示的に毎回書き込みの後に フラッシュするかどうかのみを示します)。 STDOUT は通常では、端末への出力時には行バッファリング、 それ以外ではブロックバッファリングであることに注意してください。 これは、Perl のスクリプトを rsh 配下で実行して、 実行状況を確認したい場合のように、パイプやソケットに出力するときに特に 便利でしょう。 これは入力バッファリングには何の影響も与えません。 出力チャネルの選択方法については "select" in perldoc を参照してください。 IO::Handle も参照してください。 (記憶法: パイプをホットな状態にしておくために使う。)
print 演算子のための出力フィールドセパレータ。 定義されると、この値がそれぞれの print の引数の間に表示されます。 デフォルトは undef
です。 (記憶法: print 文で "," を書いた場所に印字されるもの。)
print 演算子のための出力レコードセパレータ。 もし定義されていると、print の最後の引数の最後にこの値が表示されます。 デフォルトは undef
です。 (記憶法: print の最後に "\n" を付け加える代わりに $\
を設定する。 また、$/
に似通っているが、Perl から「バック」されるものです。)
$,
と同様ですが、これは 2 重引用符で括られた文字列 (または、同様に扱われる文字列) 内で配列とスライスの値が展開される 際に適用されます。 デフォルトではスペースになっています。(記憶法: 明らかでしょう。)
多次元配列のエミュレートのための添え字の区切文字。 ハッシュの要素を
$foo{$a,$b,$c}
のようにして参照すると、実際には
$foo{join($;, $a, $b, $c)}
という意味になります。 しかし、
@foo{$a,$b,$c} # a slice--note the @
としてはいけません。 これは以下の意味になります。
($foo{$a},$foo{$b},$foo{$c})
デフォルトは "\034" で、awk
の SUBSEP と同じです。 使おうとしている key の値がバイナリのデータを含むならば、 $;
に設定する安全な値などはないことになります。 (記憶法: コンマ (構文上の添え字区切り文字) は セミ−セミコロンなのです。 ええ、詭弁だとはわかってますが、$,
はもう既にもっと 重要な任務を持ってるんです。)
perllol で記述している「本物の」多次元配列を使うようにしてください。
その時点で選択されている出力チャネルの、その時点でのページ番号。 フォーマットで用いられます。 (記憶法: % は、nroff でのページ番号です。)
その時点で選択されている出力チャネルの、その時点での ページ長 (印字可能行数)。デフォルトは 60 です。 フォーマットで用いられます。 (記憶法: = には複数の水平線 (行) が含まれます。)
その時点で選択されている出力チャネルの、ページに残っている行数。 フォーマットで用いられます。 (記憶法: "ページ行数" - "印字済み行数")
$-[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])
と同じです。%+
と同様、この変数は現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉バッファへのアクセスを可能にします。 正規表現中に捕捉バッファ名が現れるごとに、その名前のバッファ全てで (複数あるでしょう)捕捉されている値のリストを出現順で含む配列への リファレンスと関連付けられます。
以下に例を示します:
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
経由で混ざった反復アクセスを行うと、予測不能の結果と なります。 同様に、最後に成功したマッチングを変更すると、結果は驚くべきものとなります。
その時点で選択されている出力チャネルの、その時点でのフォーマット名。 デフォルトでは、ファイルハンドルと同名です。 (記憶法: $^
の兄弟。)
その時点で選択されている出力チャネルの、その時点での ページ先頭フォーマット名。 デフォルトでは、ファイルハンドル名に _TOP を続けたもの。 (記憶法: ページの先頭へのポインタ。)
フォーマットの充填継続フィールド (^ で始まるもの) への 文字列で行分割を許す文字集合。 デフォルトは " \n-" で空白か改行の後で行分割が可能となっています。 (記憶法: 詩では「コロン」は、行の一部。)
フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f。
format() 行のための、その時点での write() アキュムレータの値。 format には、$^A
に結果を残す、formline() 呼び出しが含まれます。 自分のフォーマットを呼び出した後で、 write() は $^A
の内容を出力してから消去します。 したがって、自分で formline() を呼び出すのでなければ、 $^A
の値が見えることはありません。 perlform と "formline()" in perlfunc を参照してください。
最後に close したパイプ、バッククォート (``
) コマンド、 成功した wait() または waitpid() 呼び出し、system() 演算子が返したステータス。 このステータスワードは伝統的な Unix の wait() システムコールが返した 16 ビットのステータス(またはそのように見えるもの)です。 従ってサブプロセスの exit 値は、実際には ($? >> 8
) で、$? & 127
は、もしあれば、そのプロセスを止めたシグナルで、 $? & 128
はコアダンプがあるかどうかを示します。 (記憶法: sh や ksh と同様。)
さらに、C で h_errno
変数に対応している場合は、 gethost*()
が失敗したときに $? を通して返されます。
SIGCHLD
のシグナルハンドラを設定した場合、 $?
の値は通常ハンドラの外側では正しくない値となります。
END
サブルーチンの内側では $?
には exit()
に渡されようとしている 値を含みます。 プログラムの終了ステータスを変更するために、END
サブルーチン 内で $?
を変更できます。 例えば:
END {
$? = 1 if $? == 255; # die would make it 255
}
VMS では、use vmsish 'status'
を指定すると、 $?
はPOSIX ステータスをエミュレートしたものではなく、 実際の VMS 終了ステータスを反映します; 詳細は "$?" in perlvms を 参照してください。
"Error Indicators" も参照して下さい。
The native status returned by 最後のパイプクローズ、逆クォート (``
) コマンド、wait() と waitpid() の 成功した呼び出し、system() 演算子から返された、ネイティブなステータスです。 POSIX 風システムでは、この値は POSIX モジュールで提供される WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED 関数でデコードできます。
VMS ではこれは実際の VMS の終了ステータスを反映します; 言い換えると、これは use vmsish 'status'
プラグマが有効なときの $? と 同じです。
ソースコードを Unicode に変換するために使われる Encode オブジェクトへの オブジェクトリファレンス 。 この変数のおかげで、perl スクリプトを UTF-8 で書く必要がありません。 デフォルトは undef 。 この変数を直接操作することはとても推奨できません。
数値として使われると、その時点の C の errno
変数の値が得られます; 言い換えると、もしシステムコールやライブラリ呼び出しが失敗すると、 この変数がセットされます。 これは、$!
の値が意味を持つのは 失敗 の 直後 だけということを 意味します。
if (open my $fh, "<", $filename) {
# Here $! is meaningless.
...
} else {
# ONLY here is $! meaningful.
...
# Already here $! might be meaningless.
}
# Since here we might have either success or failure,
# here $! is meaningless.
上記の meaningless は何でもあり得ます: 0、非 0、undef
。 システムコールやライブラリ呼び出しが成功した場合は、この変数は 0 に セット されません。
文字列として使われると、対応するシステムエラーのメッセージ文字列が得られます。 たとえば、$!
にエラーの文字列を返して欲しいならば、あるいは、 die() 演算子の exit 値を設定するために、errno を設定するため $!
へ代入を行なうことが可能です。 (記憶法: 何が bang(!) したか。)
"Error Indicators" も参照して下さい。
%!
の各要素は、$!
がその値にセットされている場合にのみ真の値を 持ちます。 例えば、$!{ENOENT}
は、現在の $!
の値が ENOENT
の場合にのみ 真となります; これは、最近のエラーが "No such file or directory" (あるいは倫理的に等価なもの: 全ての OS が正確に 同じエラーを出すわけではないですし、全ての言語で出るわけでもありません) の 場合です。 あなたのシステムで特定のキーが意味があるかどうかを調べるには、 exists $!{the_key}
を使ってください; 有効なキーのリストを得るには、 keys %!
としてください。 さらなる情報と、$!
のバラエティに関しては、Errno を参照してください。
現在のオペレーティングシステムに特化したエラー情報です。 現在のところ、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() 呼び出しによって値は変わります。 (記憶法: シェルと同じ。)
Linux ユーザーへの注意: Linux では、C 関数 getpid()
と getppid()
は スレッドが異なると異なった値を返します。 移植性のために、この振る舞いは $$
には反映されず、この値はスレッド間で 一貫しています。 もし内在する getpid()
を呼び出したい場合は、CPAN モジュール Linux::Pid
が使えます。
本プロセスの実 uid を示します。 (記憶法: setuid で実行中であれば、そこ「から」来た uid です。) POSIX::setuid() を使って、実効 UID と実 UID を同時に変更できます。 $> を変更にはシステムコールが必要なので、起こりうるエラーを検出するために $! のチェックが必要です。
本プロセスの実効 uid を示します。 例:
$< = $>; # set real to effective uid
($<,$>) = ($>,$<); # swap real and effective uid
POSIX::setuid() を使って、実効 UID と実 UID を同時に変更できます。 $> を変更した場合は、変更時に起こりうるエラーを検出するために $! の チェックが必要です。
(記憶法: setuid で実行中であれば、そこ「へ」行く uidです。) $<
と $>
の交換は、setreuid() をサポートしている マシンでのみ可能です。
本プロセスの実 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 つの数値引数だけが使えます)。 $) を変更した場合は、変更時に起こりうるエラーを検出するために $! の チェックが必要です。
(記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実効 gid は right な、つまり正しいグループです。)
$<
, $>
, $(
, $)
は、実行するマシンで、 対応する set[re][ug]id() ルーティンがサポートされているときにのみ 設定可能です。 $(
と $)
の交換は、 setregid() がサポートされているマシンでのみ可能です。
実行されているプログラムの名前を示します。
$0
に代入を行なうことで ps) プログラムが覗く、 引数エリアを修正できるシステムもあります(全てではありません)。 $0 の修正は、実行しているプログラムを隠すよりは、 実行中のプログラムの状態を表示するときに、使うとよいでしょう。 (記憶法: sh や ksh と同じ。)
$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"
を含みます。
配列の最初の要素や、文字列の最初の文字のインデックスを 示します。 デフォルトは 0 ですが、理論的には、index() 関数や substr() 関数を評価するときに、Perl の動作をより awk (や Fortran) に近づけるため、1 に設定することもできます。 (記憶法: [ は添え字付けの始め。)
Perl 5 からは $[
への代入は、コンパイラ指示子として扱われ、 他のファイルの動作に影響を与えることがなくなりました。 (これが、コンパイル時定数しか代入できない理由です。) この変数の使用は非推奨で、デフォルトでは警告が出ます。
(strict のような) その他のコンパイル時指示子と違って、$[
への代入は、 同じファイルのより外側のレキシカルスコープからも見えることに注意してください。 但し、これに local() を使うことでこの値をレキシカルブロック内に束縛できます。
Perl インタプリタの version + patchlevel / 1000 が返されます。 スクリプトの最初で、そのスクリプトを実行しているインタプリタのバージョンが 適切な範囲内にあるかを調べる、といったことができます。 (記憶法: Perl のバージョンは、正しい範囲 (right bracket) にあるか。) 例:
warn "No checksumming!\n" if $] < 3.019;
実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSION
と require VERSION
のドキュメントも 参照して下さい。
浮動小数点表現は数値比較が不正確になることがあります。 文字列比較が使える新しい Perl バージョンの表現方法である $^V
を 参照して下さい。
-c スイッチに関連付けられた現在の値です。 主に -MO=... と共に用いられ、例えば AUTOLOAD を通常の遅延ロードでは なくコンパイル時に実行するといった、コンパイル時の振る舞いを 変えるために用います。 $^C = 1
に設定することは B::minus_c
を呼び出すのと似ています。
デバッグフラグの現在の値を示します。 (記憶法: -D スイッチの値。) 読み書き可能です。 コマンドラインによる等価な機能と同様に、数値とシンボル値が使えます (例: $^D = 10
または $^D = "st"
)。
正規表現デバッグフラグの現在の値です。 0 をセットすると、re 'debug' モジュールが読み込まれていても デバッグ出力を行いません。 詳細については re を参照してください。
どれくらい正規表現の最適化を行い、どれくらいのメモリを利用するかを 制御します。 デフォルトではこの値は 65536 で、512kB の一時キャッシュに相当します。 この値を大きくすると、大きなものとマッチングするときに速度を重視して 多くのメモリを使います。 もしできるだけ保守的なメモリ消費をするけれども使うこともある、というように 最適化したい場合は小さい値を設定します; 負の値を設定すると最適化は行わず、 最大限メモリを節約します。 通常の状況では、この変数はあなたの興味を引くものではないでしょう。
システムが使用するファイル記述子の最大値を示し、通常は 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 と同じスコープを持ちます。 これはレキシカルスコープを持つプラグマを実装するのに便利です。 perlpragma を参照してください。
置き換え編集の拡張子の値を示します。 置き換え編集を禁止するためには、undef
を設定します。 (記憶法: -i スイッチの値。)
デフォルトでは、メモリ不足はトラップできない致命的エラーとなります。 しかし、もし適切に構築されていれば、Perl は $^M
の中身を die() した後の緊急用メモリとして使えます。 Perl が -DPERL_EMERGENCY_SBRK
付きでコンパイルされ、 Perl の malloc を使うと仮定します。そして、
$^M = 'a' x (1 << 16);
とすると緊急用の 64K のバッファを割り当てます。 perl をコンパイルするときに独自の C コンパイルフラグを追加する 方法についての情報は、Perl 配布パッケージに含まれている INSTALL ファイルを参照して下さい。 この拡張機能を気軽に使えないようにするために、 この変数には English の長い名前はありません。
この Perl が構築されたオペレーティングシステムの名前です。 これは設定プロセス中に決定されます。 この値は $Config{'osname'}
と同じです。 Config と、perlrun でドキュメント化されている -V コマンドラインスイッチも参照して下さい。
Windows プラットフォームでは、$^O はあまり役に立ちません: これは常に MSWin32
となり、95/98/ME/NT/2000/XP/CE/.NET の違いを示していないからです。 これらを区別するためには、Win32::GetOSName() や Win32::GetOSVersion() を 使ってください (Win32 と perlport を参照してください)。
PerlIO で使われる内部変数です。 文字列は \0
で分割された二つの部分からなり、前半は入力層を、 後半は出力層を示します。
デバッグ機能のための内部変数です。 それぞれのビットの意味は変わるかもしれませんが、 現在のところは以下の通りです:
サブルーチンの出入りをデバッグします。
行毎にデバッグします。 各行を実行する毎に DB::DB() サブルーチンを呼び出します。 さらに、(0x400 のように) ソースコードを保存します。
最適化を行いません。
将来の対話的な検査のためにより多くのデータを保存します。
サブルーチンが定義されたソース行に関する情報を保持します。
シングルステップ実行で開始します。
報告時にサブルーチン名でなくサブルーチンのアドレスを使います。
goto &subroutine
も同様に報告します。
eval に対して、コンパイルされた位置を元にした「ファイル」名を提供します。
無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。
ソースコードの行数を @{"_<$filename"}
に保存します。
無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。 See also perldebguts.
最後に成功した (?{ code })
正規表現アサートの評価の結果です (perlre を参照して下さい)。おそらくもっと書き足します。
現在のインタプリタの状態を示します。
$^S 状態
--------- -------------------
undef モジュール/eval のパース中
真 (1) eval の実行中
偽 (0) その他
最初の状態は $SIG{__DIE__} と $SIG{__WARN__} のハンドラで起きる可能性が あります。
プログラムを実行開始した時刻を、紀元 (1970年の始め) からの秒数で示したものです。 ファイルテスト -M、-A、-C で返される値は、この値に基づいています。
汚染検査モードのオン・オフを反映します。 1 はオン(プログラムは -T 付きで実行されている)、0 はオフ、-1 は汚染 警告のみが有効になっている(つまり -t か -TU)ことを意味します。 この変数は読み込み専用です。
Perl のいくつかの Unicode 設定を反映します。 設定できる値に関するさらなる情報については perlrun の -C
オプションを 参照してください。 この変数は Perl 起動時に設定され、その後は読み込み専用です。
この変数は内部 UTF-8 オフセットキャッシュコードの状態を制御します。 1 はオン(デフォルト)、0 はオフ、-1 は全ての結果を線形走査と比較して、 矛盾があれば異常終了する、という形でキャッシュコードをデバッグします。
この変数は、起動時に perl によって UTF-8 ロケールが検出されたかどうかを 示します。 この情報は(-CL
コマンドラインスイッチで起動されることによって) 「utf8 性をロケールに合わせる」モードのときに perl によって使われます; これに関するさらなる情報は perlrun を参照してください。
version
オブジェクトとして表現される revision, version, subversion。
この変数は perl 5.6.0 で最初に現れました; それより前のバージョンでは 未定義値となります。 perl 5.10.0 以前では $^V は v-string 形式で表現されます。
$^V はスクリプトを実行している Perl インタプリタのバージョンが 正しい範囲に入っているかを調べるのに使えます。(記憶法: ^V をバージョンコントロールに使います。) 例:
warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1
$^V
を文字列表現に変換するには sprintf() の "%vd"
変換を使います:
printf "version is v%vd\n", $^V; # Perl's version
実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSION
と require VERSION
のドキュメントを 参照して下さい。
Perl バージョンの古い表現については $]
も参照して下さい。
警告スイッチの値で、-w スイッチが使われると内部的に真となり、 そうでない場合は直接変更可能です。 (記憶法: -w スイッチに関係します。) warnings も参照して下さい。
use warnings
プラグマで有効にされた、現在の警告チェックの集合です。 詳細については warnings
のドキュメントを参照して下さい。
この変数が真の値にセットされると、Windows での stat() はファイルを オープンしようとはしません。 これは、このファイルへの追加のハードリンクが存在する場合、リンクカウントを 決定できませんし、ファイル属性が古いものになるかもしれないことを 意味します。 一方、ファイルを開かないので、(特にファイルがネットワークドライブにある 場合は)大幅に高速です。
デフォルトで「ずさんな」stat() を使うために、この変数は、ローカルな Perl を設定するための sitecustomize.pl で設定できます。 サイトカスタマイズに関するさらなる情報については perlrun の -f を参照してください。
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 の値をパス名に変換するには、以下のコードを使ってください:
# Build up a set of file names (not command names).
use Config;
$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;
$secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS')
{$secure_perl_path .= $Config{_exe}
unless $secure_perl_path =~ m/$Config{_exe}$/i;}
@ARGV
にあるコマンドラインで指定されたファイル名に対して反復する 特殊ファイルハンドルです。 通常角かっこ <>
の中で空ファイルハンドルとして書かれます。 現在のところ、ARGV
は <>
演算子の中でのみ特別な効果があることに 注意してください; その他の場所では、<>
で開かれた最後のファイルに 対応する普通のファイルハンドルです。 特に、ファイルハンドルを想定している関数に \*ARGV
を引数として渡しても、 関数内で @ARGV
にある全てのファイルの内容を自動的に読み込むことには なりません。
<> から読込みを行なっているとき、その時点のファイル名を示します。
配列 @ARGV は、コマンドラインからスクリプトに渡す引数が入れられます。 $ARGV[0]
がプログラムのコマンド名自身ではなく、 最初の引数ですから、$#ARGV
は一般には、引数の個数 - 1 となります。 コマンド名については、$0
を参照してください。
-i を使ってその場修正を行っているときに、現在開いている出力ファイルを 示す特殊ファイルハンドルです。 たくさんの挿入をする必要があるときに $_ を修正し続けたくない場合に 有用です。 -i オプションについては perlrun を参照してください。
自動 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 を参照してください。
サブルーチンの内部では、配列 @_ はサブルーチンに渡されたパラメータです。 perlsub を参照して下さい。
ハッシュ %INC は、do
, require
, use
演算子によって インクルードされた、個々のファイル名をエントリとして持っています。 key は指定したファイル名(モジュール名はパス名に変換されます)で、 value は見つかった場所となっています。 require
演算子は、指定されたファイル名が既に インクルードされているかを、このハッシュを使って調べます。
ファイルがフック(つまりサブルーチンリファレンス; フックに関する 説明については "require" in perlfunc を参照してください)経由で読み込まれた 場合、このフックはデフォルトではファイル名の代わりに %INC に挿入されます。 しかし、フックはさらなる特定の情報を提供するために、自身で %INC エントリを セットするかもしれないことに注意してください。
ハッシュ %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() 関数がある場合は、 シグナルハンドラはこの関数を使って設定されます。 これにより、信頼性のあるシグナルハンドリングが可能になります。
デフォルトのシグナル配送ポリシーは 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
、ループ終了、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 が使えないときにのみ実行されます。
追加の情報については "die" in perlfunc, "warn" in perlfunc, "eval" in perlfunc, warnings を参照して下さい。
変数 $@
, $!
, $^E
, $?
は Perl プログラムの実行中に 発生した、異なる種類のエラー情報を保持します。 変数はエラーを報告した副システムと Perl プロセスとの「距離」 の順番に並んでいます。 これらはそれぞれ、Perl インタプリタ、C ライブラリ、 オペレーティングシステム、外部プログラムによって検出された エラーに対応しています。
これらの変数の違いを示すために、 以下のようなシングルクォートを用いた Perl 式を考えます:
eval q{
open my $pipe, "/cdrom/install |" or die $!;
my @res = <$pipe>;
close $pipe or die "bad pipe: $?, $!";
};
この文を実行した後、4 つの変数全てがセットされる可能性があります。
$@
は eval
された文字列がコンパイルされなかったとき (これは open
か close
が正しくない プロトタイプでインポートされたときに起こり得ます)、 または評価中に実行している 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
, $?
それぞれの説明を 参照して下さい。
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
はプログラム中の全ての正規表現マッチングにおいて かなりの性能低下を引き起こします。 これは use English
のスコープ内かどうかに関わりません。 この理由により、ライブラリで use English
を使うのは できるだけ避けてください。 さらなる情報については CPAN の Devel::SawAmpersand モジュール (http://www.perl.com/CPAN/modules/by-module/Devel/) の ドキュメントを参照して下さい。
例外ハンドラの中で $^S
を使おうなどとは考えてもいけません。 現在の実装の $SIG{__DIE__}
は面倒を引き寄せ、エラーの追跡を困難にします。 これの代わりに END{}
を使うか、CORE::GLOBAL::die をオーバーライドしてください。