PERLVAR(1) USER COMMANDS PERLVAR(1) NAME perlvar - Perl の定義済み変数 DESCRIPTION 定義済み名 以下の名前は Perl では特別な意味を持ちます。 記号的な名前の 多くは記憶法があるか、シェルでの類推が可能です。 それでも長 い名前を使用したい場合には use English; とプログラムの最初に書いてください。 これは、すべての短い名 前の別名として、カレントパッケージで長い名前を付けるものです。 awk から持ってきた中間的な名前を持っているものもあります。 もう一歩すすめて、現在選択されているファイルハンドルに依存す る変数の場合には、代わりに FileHandle オブジェクトに関するオ ブジェクトメソッドを呼び出して設定することができます。 (以下 の要約では HANDLE という語を含んでいます。) まず最初に必ず、 use FileHandle; と書き、その後で method HANDLE EXPR もしくは HANDLE->method(EXPR) を使います。 それぞれのメソッドは、ファイルハンドル属性の昔の値を返します。 メソッドはそれぞれ EXPR をとることができ、指定した場合には、 問題の FileHandle 属性の新しい値を指定することになります。 指定しない場合には、多くのメソッドでは現在の値に対して何もし ませんが、autoflush() では 1 を指定されたものとします。 これらの変数の中には "read-only" として扱われるものもありま す。 つまり、そういった変数に対して、直接にしろ、リファレン スを介して間接にしろ、代入を行なおうとした場合には、実行時に 例外処理が起動されます。 $ARG $_ デフォルトの入力とパターン検索のスペース。 以下の 2 つは同値です: while (<>) {...} # while の中でだけ同値 ! while ($_ = <>) {...} Perl manpages Last change: Release 5.0 Patchlevel 00 1 PERLVAR(1) USER COMMANDS PERLVAR(1) /^Subject:/ $_ =~ /^Subject:/ tr/a-z/A-Z/ $_ =~ tr/a-z/A-Z/ chop chop($_) (記憶法: 下線はある操作を覚えるためのもの。) $<digit> 最後のパターンマッチで対応する括弧のサブパターンにマ ッチした文字列が入っているが、既に抜けてしまったブロ ックでのパターンマッチは勘定に入れない。 (記憶法: \digit のようなもの。) これらの変数はすべて read-only です。 $MATCH $& 最後に成功したパターンマッチでマッチした文字列 (現在 の BLOCK で囲まれた BLOCK や eval() で隠れている部分 でのマッチは勘定に入れない)。 (記憶法: あるエディタ の & ようなもの。) この変数は read-only です。 $PREMATCH $` 最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入 れない) でマッチした部分の前の文字列。 (記憶法: ` は多くの場合クォートされた文字列の前にある。) この変 数は read-only です。 $POSTMATCH $' 最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に隠れている部分でのマッチは勘定に入 れない) でマッチした部分に続く文字列。 (記憶法: ' は多くの場合クォートされた文字列の後にある。) 例: $_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; # abc:def:ghi と印字 この変数は read-only です。 $LAST_PAREN_MATCH $+ 最後に検索されたパターンの最後の括弧にマッチした文字 列。 これはいくつかの選択肢の中でどれがマッチするの かわからないような場合に使うと便利です。 たとえば: Perl manpages Last change: Release 5.0 Patchlevel 00 2 PERLVAR(1) USER COMMANDS PERLVAR(1) /Version: (.*)|Revision: (.*)/ && ($rev = $+); (記憶法: ポジティブで前向き。) この変数は read-only です。 $MULTILINE_MATCHING $* 文字列中で複数行マッチを行なうために 1 に設定し、0 にすると、Perl が文字列に 1 行しか無いと仮定して、あ る種のパターンマッチに関する最適化を行なうようになり ます。 複数の改行を含む文字列でのパターンマッチを "$*" が 0 のまま行なうと結果は信用のないものになりま す。 デフォルトでは 0 になっています。 (記憶法: * は複数のものにマッチします。) この変数は "^" と "$" の解釈にのみ影響します。 リテラルの改行文字は、$* が 0 であっても検索することが可能です。 Perl 5 では "$*" を使わないようにしてください。 input_line_number HANDLE EXPR $INPUT_LINE_NUMBER $NR $. 最後に読み込みを行なったファイルハンドルの現在の入力 行番号。 この変数は、read-only と考えるべきです。 明示的にファイルハンドルをクローズした場合にだけ、行 番号がリセットされることに注意してください。 "<>" 構文では明示的にクローズを行ないませんから、ARGV の ファイルに跨って行番号が数えられることになります (が、 eof() の例を参照してください)。 (記憶法: 多くのプロ グラムで "." が現在行番号を示すように使われています。) input_record_separator HANDLE EXPR $INPUT_RECORD_SEPARATOR $RS $/ 入力レコードセパレータで、デフォルトでは改行文字。 空文字列に設定されると、空行を区切りとして扱うことを 含めて、awk の変数 RS のように働きます。 複数文字の 区切文字を示すために、文字列を設定することもできます。 この変数に "\n\n" を設定すると、空行が続く場合におい て、"" を設定した場合とわずかに違う動作をするように なります。 "" を設定した場合には、複数の空行も 1 つ の空行であるかのように扱います。 "\n\n" を設定した 場合には、単純に次の文字が (たとえ改行文字であっても) 次の段落に含まれるものとして扱います。 (記憶法: / は、詩を引用するときに、行の区切りを示すのに使う文字 です。) Perl manpages Last change: Release 5.0 Patchlevel 00 3 PERLVAR(1) USER COMMANDS PERLVAR(1) undef $/; $_ = <FH>; # ファイル全体が読まれる s/\n[ \t]+/ /g; autoflush HANDLE EXPR $OUTPUT_AUTOFLUSH $| 0 以外に設定されると、その時点で選択されている出力チ ャネルに write や print を行なうごとに、強制的にフラ ッシュします。 デフォルトでは 0 となっています。 STDOUT は通常では、端末への出力時には行バッファリン グ、それ以外ではブロックバッファリングであることに注 意してください。 これは、Perl のスクリプトを rsh 配 下で実行して、実行状況を確認したい場合のように、パイ プに出力するときに特に便利でしょう。 (記憶法: パイ プをホットな状態にしておくために使う。) output_field_separator HANDLE EXPR $OUTPUT_FIELD_SEPARATOR $OFS $, print 演算子のための出力フィールドセパレータ。 通常 print 演算子は、コンマで区切って指定したフィールドを 単純に印字します。 より、awk に近い動作をさせるには、 フィールドの区切りとして印字されるものとして awk の 変数 OFS に設定するものを、この変数に設定します。 (記憶法: print 文で , を書いた場所に印字されるもの。) output_record_separator HANDLE EXPR $OUTPUT_RECORD_SEPARATOR $ORS $\ print 演算子のための出力レコードセパレータ。 通常 print 演算子は、コンマで区切って指定したフィールドを 単純に印字し、改行などレコードセパレータと想定するも のをつけません。 より、awk に近い動作をさせるには、 print の最後に印字されるものとして awk の変数 ORS に 設定するものを、この変数に設定します。 (記憶法: print の最後に \n を付け加える代わりに "$\" を設定す る。 また、/ に似通っているが、Perl から「バック」 されるものです。) $LIST_SEPARATOR $" "$," と同様ですが、これは 2 重引用符で括られた文字列 Perl manpages Last change: Release 5.0 Patchlevel 00 4 PERLVAR(1) USER COMMANDS PERLVAR(1) (または、同様に扱われる文字列) 内で配列値が展開され る際に適用されます。 デフォルトではスペースになって います。 (記憶法: 明らかでしょう。) $SUBSCRIPT_SEPARATOR $SUBSEP $; 多次元配列のエミュレートのための添え字の区切文字。 ハッシュの要素を $foo{$a,$b,$c} のようにして参照すると、実際には $foo{join($;, $a, $b, $c)} という意味になります。 しかし、 @foo{$a,$b,$c} # スライス -- @ に注意 としてはいけません。これは、 ($foo{$a},$foo{$b},$foo{$c}) という意味になります。 デフォルトは "\034" で、awk の SUBSEP と同じです。 使おうとしている key の値がバイナリのデータを含むな らば、"$;" に設定する安全な値などはないことになりま す。 (記憶法: コンマ (構文上の添え字区切り文字) は セミ−セミコロンなのです。 ええ、詭弁だとはわかって ますが、"$," はもう既にもっと重要な任務を持ってるん です。) Perl 5 では「本物の」多次元配列を使うようにしてくだ さい。 $OFMT $# 数字を印字する際の出力フォーマット。 この変数は、不 十分ではありますが、awk の変数 OFMT をエミュレートし ようとするものです。しかしながら、awk と Perl は異な る記法で数値を表わしています。 また、初期値は %.6g ではなく、%.20g となっていますので、awk での値を得る には、明示的に "$#" を設定する必要があります。 (記 憶法: # は数値記号です。) Perl 5 では "$#" を使わないようにしてください。 Perl manpages Last change: Release 5.0 Patchlevel 00 5 PERLVAR(1) USER COMMANDS PERLVAR(1) format_page_number HANDLE EXPR $FORMAT_PAGE_NUMBER $% その時点で選択されている出力チャネルの、その時点での ページ番号。 (記憶法: % は、nroff でのページ番号で す。) format_lines_per_page HANDLE EXPR $FORMAT_LINES_PER_PAGE $= その時点で選択されている出力チャネルの、その時点での ページ長 (印字可能行数)。 デフォルトは 60 です。 (記憶法: = には複数の水平線 (行) が含まれます。) format_lines_left HANDLE EXPR $FORMAT_LINES_LEFT $- その時点で選択されている出力チャネルの、ページに残っ ている行数。 (記憶法: "ページ行数" - "印字済み行数") format_name HANDLE EXPR $FORMAT_NAME $~ その時点で選択されている出力チャネルの、その時点での フォーマット名。 デフォルトでは、ファイルハンドルと 同名。 (記憶法: "$^" の兄弟。) format_top_name HANDLE EXPR $FORMAT_TOP_NAME $^ その時点で選択されている出力チャネルの、その時点での ページ先頭フォーマット名。 デフォルトでは、ファイル ハンドル名に _TOP を続けたもの。 (記憶法: ページの 先頭へのポインタ。) format_line_break_characters HANDLE EXPR $FORMAT_LINE_BREAK_CHARACTERS $: フォーマットの充填継続フィールド (^ で始まるもの) へ の文字列で行分割を許す文字集合。 デフォルトは " \n-" で空白か改行の後で行分割が可能となっています。 (記 憶法: 詩では「コロン」は、行の一部。) Perl manpages Last change: Release 5.0 Patchlevel 00 6 PERLVAR(1) USER COMMANDS PERLVAR(1) format_formfeed HANDLE EXPR $FORMAT_FORMFEED $^L フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f。 $ACCUMULATOR $^A format 行のための、その時点での write() アキュムレー タの値。 format には、$^A に結果を残す、formline() コマンドが含まれます。 自分のフォーマットを呼び出し た後で、write() は $^A の内容を出力してから消去しま す。 したがって、自分で formline() を呼び出すのでな ければ、$^A の値が見えることはありません。 perlform manpage と perlfunc manpage の formline() の項を参照 してください。 $CHILD_ERROR $? 最後に close したパイプ、バッククォート (``) コマン ド、system() 演算子が返したステータス。 このステー タスワードは wait() システムコールが返したものですか ら、サブプロセスの exit 値は、実際には ($? >> 8) で あることに注意してください。 つまり多くのシステムで $? & 255 は、もしあれば、そのプロセスを止めたシグナ ルとコアダンプがあるかどうかを示します。 (記憶法: sh や ksh と同様。) $OS_ERROR $ERRNO $! 数値コンテキストで用いられると、その時点の errno の 値が (通常の注意事項と供に) 得られます。 (これは、 システムエラーを示す特定のエラーが得られた場合でもな ければ、"$!" の値が、特に何かを示すものであると、頼 ってはならないということです。) 文字列コンテキスト で使われると、対応するシステムエラーのメッセージ文字 列が得られます。 たとえば、"$!" にエラーの文字列を 返して欲しいならば、errno を設定するため、あるいは、 die() 演算子の exit 値を設定するために、"$!" へ代入 を行なうことが可能です。 (記憶法: 何が bang(!) した か。) $EVAL_ERROR $@ 最後の eval() コマンドによる Perl の構文エラーメッセ ージです。 空文字列であれば、最後の eval() が正常に 解析され、実行されたことになります (が、実行した演算 子が、通常の意味で失敗しているかもしれません)。 Perl manpages Last change: Release 5.0 Patchlevel 00 7 PERLVAR(1) USER COMMANDS PERLVAR(1) (記憶法: どこで ("at" where) 構文エラーが起ったか。) $PROCESS_ID $PID $$ スクリプトを実行している Perl のプロセス番号です。 (記憶法: シェルと同じ。) $REAL_USER_ID $UID $< 本プロセスの実 uid を示します。 (記憶法: setuid で 実行中であれば、そこ「から」来た uid です。) $EFFECTIVE_USER_ID $EUID $> 本プロセスの実効 uid を示します、 例: $< = $>; # 実 uid に実効 uid を設定 ($<,$>) = ($>,$<); # 実 uid と実効 uid を交換 (記憶法: setuid で実行中であれば、そこ「へ」行く uid です。) "$<" と "$>" の交換は、setreuid() をサポー トしているマシンでのみ可能です。 $REAL_GROUP_ID $GID $( 本プロセスの実 gid を示します。 同時に複数のグルー プに所属できるマシンでは、所属するグループをスペース で区切ったリストが得られます。 最初の数値は、 getgid() で返されるものです。 その後に getgroups() が返す値が続き、その中の 1 つは、最初の値と同じかも しれません。 (記憶法: 括弧は、グループ化に使われま す。 setgid で実行中であれば、実 gid は LEFT した、 つまり離れたグループです。) $EFFECTIVE_GROUP_ID $EGID $) 本プロセスの実効 gid を示します。 同時に複数のグル ープに所属できるマシンでは、所属するグループをスペー スで区切ったリストが得られます。 最初の数値は、 getegid() で返されるものです。 その後に getgroups() が返す値が続き、その中の 1 つは、最初の値と同じかも しれません。 (記憶法: 括弧は、グループ化に使われま Perl manpages Last change: Release 5.0 Patchlevel 00 8 PERLVAR(1) USER COMMANDS PERLVAR(1) す。 setgid で実行中であれば、実効 gid は RIGHT な、 つまり正しいグループです。) 注: "$<"、"$>"、"$("、"$)" は、実行するマシンで、対 応する set[re][ug]id() ルーティンがサポートされてい るときにのみ設定可能です。 "$(" と "$)" の交換は、 setregid() がサポートされているマシンでのみ可能です。 $PROGRAM_NAME $0 実行されている Perl スクリプトの、ファイル名を示しま す。 "$0" に代入を行なうと、ps(1) プログラムが覗く、 引数エリアを修正します。 実行しているプログラムを隠 すよりは、実行中のプログラムの状態を表示するときに、 使うとよいでしょう。 (記憶法: sh や ksh と同じ。) $[ 配列の最初の要素や、文字列の最初の文字のインデクスを 示します。 デフォルトは 0 ですが、index() 関数や substr() 関数を評価するときに、Perl の動作をより awk (や Fortran) に近づけるため、1 に設定することもでき ます。 (記憶法: [ は添え字付けの始め。) Perl 5 では "$[" への代入は、コンパイラへのディレク ティブとして扱われ、他のファイルの動作に影響を与える ことがなくなりました。 この変数は使わないようにして ください。 $PERL_VERSION $] perl -v としたときに表示される文字列を示します。 ス クリプトの最初で、そのスクリプトを実行しているインタ プリタのバージョンが適切な範囲内にあるかを調べる、と いったことができます。 数値コンテキストで使われると、 version + patchlevel / 1000 が返されます。 例: # ファイル名補完の確認 (5.000 ではバグ) ($version,$patchlevel) = $] =~ /(\d+\.\d+).*\nPatch level: (\d+)/; print STDERR "(No filename completion available.)\n" if $version * 1000 + $patchlevel < 2016; あるいは、数値的に warn "No checksumming!\n" if $] < 3.019; (記憶法: Perl のバージョンは、正しい範囲 (right bracket) にあるか。) $DEBUGGING $^D デバッグフラグの現在の値を示します。 (記憶法: -D ス Perl manpages Last change: Release 5.0 Patchlevel 00 9 PERLVAR(1) USER COMMANDS PERLVAR(1) イッチの値。) $SYSTEM_FD_MAX $^F システムが使用するファイル記述子の最大値を示し、通常 は 2 です。 システムファイル記述子は、exec() された プロセスに渡されますが、それ以降のファイル記述子は渡 されません。 また、open() の実行中は、システムファ イル記述子は、たとえ open() が失敗しても、保存されま す。 (通常のファイル記述子は、open() が実行される前 にクローズされます。) ファイル記述子の close-on-exec のステータスは、exec 時ではなく、open 時の $^F の値 によって決められます。 $INPLACE_EDIT $^I 置き換え編集の拡張子の値を示します。 置き換え編集を 禁止するためには、undef を設定します。 (記憶法: -i スイッチの値。) $PERLDB $^P デバッガが自分自身をデバッグしないようにクリアする、 内部フラグです。 これをクリアして、デバッグしないよ うにすることも考えられます。 $BASETIME $^T スクリプトを実行開始した時刻を、紀元 (1970) からの秒 数で示したものです。 ファイルテスト -M、-A、-C で返 される値は、この値に基づいています。 $WARNING $^W 警告スイッチの値で、真か偽が設定されます。 (記憶法: -w スイッチに関係します。) $EXECUTABLE_NAME $^X Perl バイナリ自身が実行された時の名前を C の argv[0] から持ってきたものです。 $ARGV <> から読込みを行なっているとき、その時点のファイル 名を示します。 @ARGV 配列 @ARGV は、コマンドラインからスクリプトに渡す引 数が入れられます。 $ARGV[0] がコマンド名ではなく、 最初の引数ですから、$#ARGV は一般には、引数の個数 -1 となります。 コマンド名については、"$0" を参照して Perl manpages Last change: Release 5.0 Patchlevel 00 10 PERLVAR(1) USER COMMANDS PERLVAR(1) ください。 @INC 配列 @INC には、do EXPR、require、use によって評価す る Perl スクリプトを探す場所のリストが納められていま す。 初期状態では、コマンドラインスイッチ -I の引数 とデフォルトの Perl ライブラリディレクトリ (おそらく "/usr/local/lib/perl5") とカレントディレクトリを表わ す "." を順につなげたものです。 %INC ハッシュ %INC は、do や require によってインクルード された、個々のファイル名をエントリとして持っています。 key は指定したファイル名で、value は実際に見つかった 場所となっています。 require コマンドは、指定された ファイル名が既にインクルードされているかを、この配列 を使って調べます。 $ENV{expr} ハッシュ %ENV には、その時点の環境変数が設定されてい ます。 %ENV に値を設定することで、チャイルドプロセ スの環境変数を変更します。 $SIG{expr} ハッシュ %SIG は、さまざまなシグナルのハンドラを設定 するのに使用されます。 例: sub handler { # 第一引数はシグナル名 local($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 を無視する 配列 %SIG には、Perl スクリプト内で実際に設定された シグナルに対する値だけを保持しています。 いくつか他 にも例を示します: $SIG{PIPE} = Plumber; # やめて !! $SIG{"PIPE"} = "Plumber"; # よい、main::Plumber を仮定 $SIG{"PIPE"} = \&Plumber; # よい、現在の Plumber を仮定 $SIG{"PIPE"} = Plumber(); # え? Plumber() が返したもの? 「やめて」と書いたのは、裸の単語なので、問題となるか らです。 時には関数を表現する文字列となりますが、時 にはその時点、その場所で呼び出されるサブルーティンコ ールとなるからです。 確実にする最善の方法は、クォー トするか、リファレンスをとることです。 *Plumber で もかまいません。 perlsub manpage を参照してください。 Perl manpages Last change: Release 5.0 Patchlevel 00 11