perlvar - Perl で定義済みの変数
(定義済みの変数)
以下の名前は 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" として扱われるものもあります。 つまり、そういった変数に対して、直接にしろ、リファレンスを 介して間接にしろ、代入を行なおうとした場合には、実行時に 例外処理が起動されます。
以下のリストはまずスカラ変数、それから配列、ハッシュの順に 並んでいます。
デフォルトの入力とパターン検索のスペース。 以下の 2つは同値です:
while (<>) {...} # equivalent only in while!
while (defined($_ = <>)) {...}
/^Subject:/
$_ =~ /^Subject:/
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
chomp
chomp($_)
Perl が(あなたが使いたくなくても) $_ を仮定する場合がいくつかあります。
様々な単項関数。ord() や int()、また -t 以外の全ての
ファイルテスト (-f, -d)など。-t のデフォルトは STDIN です。
print() や unlink() などの様々なリスト関数。
=~ 演算子なしで用いられたパターンマッチ演算 m//, s///, tr///。
foreach ループでの他の変数が補われなかった場合のデフォルトの
繰り返し変数。
grep() 関数と map() 関数の暗黙の繰り返し変数。
<FH> が単独で while テストでテストされた場合の
結果を入れるデフォルトの場所。
while テスト以外ではこれは起こりません。
(記憶法: 下線はある操作を覚えるためのもの。)
最後のパターンマッチで対応する括弧のサブパターンにマッチした 文字列が入っているが、既に抜けてしまったブロックでの パターンマッチは勘定に入れない。 (記憶法: \(数字) のようなもの。) これらの変数はすべて read-onlyで、現在の BLOCK に動的なスコープを持ちます。
最後に成功したパターンマッチでマッチした文字列 (現在の BLOCK で囲まれた BLOCK や eval() で隠れている部分でのマッチは 勘定に入れない)。 (記憶法: あるエディタの & ようなもの。) この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 BUGS を参照して下さい。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた
BLOCK や eval() に隠れている部分でのマッチは勘定に入れない) で
マッチした部分の前の文字列。
(記憶法: ` は多くの場合クォートされた文字列の前にある。)
この変数は read-only です。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 BUGS を参照して下さい。
最後の成功したパターンマッチ (現在のBLOCK で囲まれた
BLOCK や eval() に隠れている部分でのマッチは勘定に入れない) で
マッチした部分に続く文字列。
(記憶法: ' は多くの場合クォートされた文字列の後にある。) 例:
$_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # prints abc:def:ghi
この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
この変数をプログラムのどこかで使うと、プログラム中の全ての正規表現 マッチングにおいてかなりの性能低下を引き起こします。 BUGS を参照して下さい。
最後に検索されたパターンの最後の括弧にマッチした文字列。 これはいくつかの選択肢の中でどれがマッチするのか わからないような場合に使うと便利です。たとえば:
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
(記憶法: ポジティブで前向き。) この変数は read-only で、現在の BLOCK に動的なスコープを持ちます。
この配列は、現在アクティブな動的スコープで最後に成功した
サブマッチの最後へのオフセットを保持します。
$+[0] はマッチ全体の文字列の最後へのオフセットです。
これはマッチした変数に対して pos 関数を呼び出したときの
返り値と同じです。
この配列の n 番目の要素は n 番目のサブマッチのオフセットを
保持していますので、$+[1] は過去の $1 の終わりのオフセット、
$+[2] は $2 のオフセット、という形になります。
$#+ は最後に成功したマッチでいくつサブグループがあるかを
決定するのに使えます。
@- 変数の例を参照して下さい。
文字列中で複数行マッチを行なうために非ゼロに設定し、
0 (または undef)にすると、Perl が文字列に 1 行しか無いと仮定して、
ある種のパターンマッチに関する最適化を行なうようになります。
複数の改行を含む文字列でのパターンマッチを
$* が 0 または undef のまま行なうと結果は信用の
ないものになります。
デフォルトでは undef になっています。
(記憶法: * は複数のものにマッチします。)
この変数は ^ と $ の解釈にのみ影響します。
リテラルの改行文字は、$* == 0 であっても検索することが可能です。
最近の Perl では "$*" を使わないようにしてください。
パターンマッチの /s と /m の修飾子に取って代わられています。
数値でない値を $* に代入すると警告を引き起こします
(そして $* は $* == 0 のように振る舞います)。
一方数値を $* に代入すると暗黙に int が値に適用されます。
最後にread() (または seek または tell)を
行なったファイルハンドルの現在の入力レコード番号。
この値はファイルの実際の物理行番号とは異なるかもしれません。
「行」とは何かによります。
これを変えるには $/ を参照して下さい。
明示的にファイルハンドルをクローズした場合に、行番号がリセットされます。
<> 構文では明示的にクローズを行ないませんから、ARGV の
ファイルに跨って行番号が数えられることになります (が、
perlfunc/eof の例を参照してください)。
この変数は読み込み専用と考えてください。
値を設置してもシークポインタは移動しません。自力でする必要があります。
$.を local 化すると、Perl の「最後に読んだファイルハンドル」を
local 化する効果があります。
(記憶法: 多くのプログラムで "." が現在行番号を示すように使われています。)
入力レコードセパレータで、デフォルトでは改行文字。
これは Perl での「行」とは何か、ということに影響を与えます。
空文字列に設定されると、空行をセパレータとして扱うことを
含めて、awk の変数 RS のように働きます
(空行はスペースやタブを含んでいてはいけません)。
複数文字の区切文字を示すために、文字列を設定することもできます。
また、ファイルの最後まで読み込むために undef を指定することもできます。
この変数に "\n\n" を設定すると、空行が続く場合において、
"" を設定した場合とわずかに違う動作をするようになります。
"" を設定した場合には、複数の空行も 1 つの空行であるかのように扱います。
"\n\n" を設定した場合には、単純に次の文字が (たとえ改行文字であっても)
次の段落に含まれるものとして扱います。
(記憶法: /は、詩を引用するときに、行の区切りを示します。)
undef $/; # enable "slurp" mode
$_ = <FH>; # whole file now here
s/\n[ \t]+/ /g;
注意: $/ は文字列であり、正規表現ではありません。
awk は何かもっとうまくやらなくてはいけません。:-)
$/ に整数、整数を含むスカラ、整数に変換できるスカラのいずれかへの
リファレンスをセットすると、行を読む代わりにレコードを読もうとします。
この場合、最大レコードサイズはリファレンス先の整数値となります。つまり:
$/ = \32768; # or \"32768", or \$var_containing_32768
open(FILE, $myfile);
$_ = <FILE>;
これは FILE から 32768 バイトを超えないようにレコードを読み込みます。 もしレコード指向のファイルを読み込まない場合 (あるいは OS がレコード指向ファイルを持たない場合)、 読み込み毎にデータのチャンク全部を取り込みます。 もしレコードがセットしたレコードサイズより大きい場合、 レコードの部分を取り込みます。
VMS では、レコード読み込みは sysread と等価に行われますので、
レコード読み込みと非レコード読み込みを同じファイルで混ぜないのが
最善です。(これはあまり問題になりません。なぜなら
レコード読み込みしたいファイルは多分行モードでは使えないものだからです。)
VMS 以外のシステムでは普通の I/O を使いますので、
同じファイルのレコード読み込みと非レコード読み込みを混ぜても安全です。
perlport/"Newlines" と $. も参照してください。
0 以外に設定されると、
その時点で選択されている出力チャネルを
直ちにその場でフラッシュし、
さらに write や print を行なうごとに、強制的にフラッシュします。
デフォルトでは 0 となっています
(チャンネルが実際にシステムによってバッファリングされているかどうかは
関知しません。$| は Perl が明示的に毎回書き込みの後に
フラッシュするかどうかのみを示します)。
STDOUT は通常では、端末への出力時には行バッファリング、
それ以外ではブロックバッファリングであることに注意してください。
これは、Perl のスクリプトを rsh 配下で実行して、
実行状況を確認したい場合のように、パイプやソケットに出力するときに特に便利でしょう。
これは入力バッファリングには何の影響も与えません。
(記憶法: パイプをホットな状態にしておくために使う。)
print 演算子のための出力フィールドセパレータ。 通常 print 演算子は、引数を修飾なしで単純に印字します。 より、awk に近い動作をさせるには、 フィールドの区切りとして印字されるものとして awk の 変数 OFS に設定するものを、この変数に設定します。 (記憶法: print 文で "," を書いた場所に印字されるもの。)
print 演算子のための出力レコードセパレータ。
通常print 演算子は、引数を単純に印字し、
改行などレコード終わりの文字列をつけません。
より awk に近い動作をさせるには、
print の最後に印字されるものとして awk の変数 ORS に
設定するものを、この変数に設定します。
(記憶法: print の最後に "\n" を付け加える代わりに $\ を設定する。
また、$/ に似通っているが、Perl から「バック」されるものです。)
$, と同様ですが、これは 2 重引用符で括られた文字列
(または、同様に扱われる文字列) 内で配列とスライスの値が展開される
際に適用されます。
デフォルトではスペースになっています。(記憶法: 明らかでしょう。)
多次元配列のエミュレートのための添え字の区切文字。 ハッシュの要素を
$foo{$a,$b,$c}
のようにして参照すると、実際には
$foo{join($;, $a, $b, $c)}
という意味になります。 しかし、
@foo{$a,$b,$c} # スライス -- @ に注意
としてはいけません。これは以下の意味になります。
($foo{$a},$foo{$b},$foo{$c})
デフォルトは "\034" で、awk の SUBSEP と同じです。
使おうとしている key の値がバイナリのデータを含むならば、
$; に設定する安全な値などはないことになります。
(記憶法: コンマ (構文上の添え字区切り文字) は
セミ−セミコロンなのです。
ええ、詭弁だとはわかってますが、$, はもう既にもっと
重要な任務を持ってるんです。)
perllol で記述している「本物の」多次元配列を使うようにしてください。
数字を印字する際の出力フォーマット。
この変数は、不十分ではありますが、awk の変数 OFMT を
エミュレートしようとするものです。
しかしながら、awk と Perl は異なる記法で数値を表わしています。
また、初期値は"%.ng" で、ここで n はシステムの float.h で
定義されているマクロ DBL_DIG の値です。
これはawk のOFMT のデフォルト値である "%.6g" と異なっていますので、
awk での値を得るには、明示的に $# を設定する必要があります。
(記憶法: # は数値記号です。)
$# は古いものなので使わないようにしてください。
その時点で選択されている出力チャネルの、その時点でのページ番号。 フォーマットで用いられます。 (記憶法: % は、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 でマッチした後、以下のようになります。
その時点で選択されている出力チャネルの、その時点でのフォーマット名。
デフォルトでは、ファイルハンドルと同名です。
(記憶法: $^ の兄弟。)
その時点で選択されている出力チャネルの、その時点での ページ先頭フォーマット名。 デフォルトでは、ファイルハンドル名に _TOP を続けたもの。 (記憶法: ページの先頭へのポインタ。)
フォーマットの充填継続フィールド (^ で始まるもの) への 文字列で行分割を許す文字集合。 デフォルトは " \n-" で空白か改行の後で行分割が可能となっています。 (記憶法: 詩では「コロン」は、行の一部。)
フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f。
format() 行のための、その時点での write() アキュムレータの値。
format には、$^A に結果を残す、formline() 呼び出しが含まれます。
自分のフォーマットを呼び出した後で、
write() は $^A の内容を出力してから消去します。
したがって、自分で formline() を呼び出すのでなければ、
$^A の値が見えることはありません。
perlform と perlfunc/formline() を参照してください。
最後に close したパイプ、バッククォート (``) コマンド、
成功した wait() または waitpid() 呼び出し、system() 演算子が返したステータス。
このステータスワードは 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 終了ステータスを反映します。
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) プログラムが覗く、
引数エリアを修正できるシステムもあります。
実行しているプログラムを隠すよりは、
実行中のプログラムの状態を表示するときに、使うとよいでしょう。
(記憶法: sh や ksh と同じ。)
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 VERSION と require 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 コマンドラインスイッチも参照して下さい。
デバッグ機能のための内部変数です。 それぞれのビットの意味は変わるかもしれませんが、 現在のところは以下の通りです:
サブルーチンの出入りをデバッグします。
行毎にデバッグします。
最適化を行いません。
将来の対話的な検査のためにより多くのデータを保存します。
サブルーチンが定義されたソース行に関する情報を保持します。
シングルステップ実行で開始します。
報告時にサブルーチン名でなくサブルーチンのアドレスを使います。
goto &subroutine も同様に報告します。
eval に対して、コンパイルされた位置を元にした「ファイル」名を提供します。
無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。
コンパイル時にのみ有効なビットもあり、実行時にのみ有効なビットもあります。 これは新しいメカニズムであり、詳細は変わるかもしれません。
最後に成功した (?{ 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 VERSION と require 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 を参照して下さい。
(エラー指示子)
変数 $@, $!, $^E, $? は Perl プログラムの実行中に
発生した、異なる種類のエラー情報を保持します。
変数はエラーを報告した副システムと Perl プロセスとの「距離」
の順番に並んでいます。
これらはそれぞれ、Perl インタプリタ、C ライブラリ、
オペレーティングシステム、外部プログラムによって検出された
エラーに対応しています。
これらの変数の違いを示すために、 以下のようなシングルクォートを用いた Perl 式を考えます:
eval q{
open PIPE, "/cdrom/install |";
@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 をオーバーライドしてください。