Go to the previous, next section.

予約変数

以下の名前の変数は perl において特別な意味をもつ。 このうち幾つかはアルファベットの名前を持たせても良かったのだが、 全変数を `a-zA-Z' でリセットすることができるようにするため、 そうはしなかった。 このため、わけの分からないシンボル名で苦労しなければならない。

ほとんどのものはそれなりに覚え易いものまたはシェル変数と似たものにしてある。

$_ : 入力およびパターン検索におけるデフォルト

$_ : 入力およびパターン検索におけるデフォルト。

次の式のペアはそれぞれ等価である。

while (<>) { ...     # only equivalent in while!
while ($_ = <>) { ...

/^Subject:/
$_ =~ /^Subject:/

y/a-z/A-Z/
$_ =~ y/a-z/A-Z/

chop
chop($_)

覚え方:
? ( underline is understood in certain operations.)

$. : 最後に読み込みを行ったファイルハンドルの現在の行番号

$. : 最後に読み込みを行ったファイルハンドルの現在の行番号。

参照のみ可能。ファイルハンドルを明示的にクローズした時のみリセットされる。

<> は明示的なクローズを行わないので、 ARGV ファイルを読んでいくと、行番号はどんどん増加する。 ( eof の例を参照。)See section eof.

覚え方:
多くのプログラムにおいて `.' は現在の行番号を示すために用いられる。

$/ : 入力レコードのセパレータ

$/ : 入力レコードのセパレータ。デフォルトは newline 。

awk の変数 RS のような働きをする。 ヌル文字列をセットすると、ブランク行を区切りとする点も同じである。 複数文字からなる文字列をセットして、 複数文字のデリミッタにマッチさせることも可能である。

覚え方:
`/' は詩を引用する時、行の境界を分けるのに使われる。

$, : コンマで区切った print 関数の引数の出力セパレータ

$, : コンマで区切った print 関数の引数の出力セパレータ

通常、 print はコンマで区切られたフィールドをそのまま(何もつけずに)出力する。 awk のように出力するには、awk 変数 OFS にセットする値 (フィールド間を何で区切るか)をこの変数にセットする。

覚え方:
print 関数において `,' で区切ると出力される文字。

$” : 配列値を ”” で囲んだ時に要素間に入るセパレータ

$" : 配列値を "" で囲んだ時に要素間に入るセパレータ

配列値が " で囲まれた文字列に変換される時 (または同様に変換される文字列)に適用される点を除いて、 $, と同じ。デフォルトはスペース。

覚え方:
明らかだと思うのだが。

$\ : print 関数の最後に出力するセパレータ

$\ : print 関数の最後に出力するセパレータ

通常、print はコンマで区切られたフィールドを出力する時、 最後に newline やレコードセパレータをつけずに出力する。 awk のように出力するには、awk の ORS 変数にセットする値 (print の最後に何を出力するか)をこの変数にセットする。

覚え方:
print の最後に \n をつける替わりに $\ をセットする。 また、`\'`/' と似ているが、 それは"逆に" perl からデータを受け取る時に使う。

$# : 数字の出力フォーマット

$# : 数字の出力フォーマット

この変数は、 awk の OFMT 変数を不完全にエミュレートしようとしたものである。 だが、awk と perl で"何が数値か"を判断する際に違いが出ることがある。 また、初期値は %.6g ではなく %.20g であるので、 awk と同じ出力を得るには、$# をセットする必要がある。

覚え方:
`#' は数を表す。

$% : チャンネルの現在のページ番号

$% : 現在セレクトされている出力チャンネルの現在のページ番号。

覚え方:
nroff において `%' はページ番号である。

$= : 出力チャンネルの現在のページ長さ

$= : 現在セレクトされている出力チャンネルの現在のページ長さ (出力可能行数)。

デフォルトは 60。

覚え方:
`=' は水平な線からできている。

$− : 出力チャンネルのページに残っている行数

$- : 現在セレクトされている出力チャンネルのページに残っている行数。

覚え方:
ページの行数 - 出力した行数。

$ ̄ : 出力チャンネルの現在のレポートフォーマット名

$~ : 現在セレクトされている出力チャンネルの 現在のレポートフォーマットの名前。 デフォルトはファイルハンドル名。

覚え方:
$^ の兄弟。

$^ : 出力チャンネルの現在のページトップ名

$^ : 現在セレクトされている出力チャンネルの現在のページトップの名前。 デフォルトはファイルハンドル名に "_TOP" をつけたもの。

覚え方:
ページのトップを指している。

$| : write または print の後にフラッシュを行うか否か

$| : write または print の後にフラッシュを行うか否か

非 0 にセットすると、現在セレクトされている出力チャンネルに対する 全ての write または print の後にフラッシュを行う。 デフォルトは 0 である。

STDOUT は端末への出力は行バッファリングされ、 それ以外はブロックバッファリングされることに注意。 この変数をセットすると、perl スクリプトを rsh の下で走らせて、 何が起こっているかをその時に見たい場合など、パイプに出力する際に便利である。

覚え方:(?)
(when you want your pipes to be piping hot.)

$$ : スクリプトを走らせている perl のプロセス番号

$$ : スクリプトを走らせている perl のプロセス番号。

覚え方:
シェルと同じ。

$? : パイプのクローズ、system 関数などで返ったステータス

$? : 最後のパイプのクローズ、`コマンド`system 関数から返ったステータス。

これはシステムコール wait() から返ったステータスワードであり、 サブプロセスの実際の終了値は $? >> 8 であることに注意。

$? & 255 により、プロセスが終了する原因となったシグナル(もしあれば)、 およびコアダンプがあったかどうかが得られる。

覚え方:
sh および ksh と同じ。

$& : 最後のパターンマッチでマッチした文字列

$& : 最後のパターンマッチでマッチした文字列。

ブロックや現在のブロックで囲まれている eval の中のマッチは 全くカウントしていない。

覚え方:
あるエディタにおける `&' と同じ。

$‘ : 最後のパターンマッチでマッチした文字列の前の文字列

$` : 最後のパターンマッチでマッチした文字列の前の文字列。

ブロックや現在のブロックで囲まれている eval の中のマッチは 全くカウントしていない。

覚え方:
``' は引用文字列の前に来ることが多い。

$’: 最後のパターンマッチでマッチした文字列の後に続く文字列

$' : 最後のパターンマッチでマッチした文字列の後に続く文字列。

ブロックや現在のブロックで囲まれている eval の中のマッチは 全くカウントしていない。

覚え方:
`'' は引用文字列の後に来ることが多い。

(例)

$_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n";      # prints abc:def:ghi

$+ : 最後の検索パターンでマッチした最後の括弧

$+ : 最後の検索パターンにおいてマッチした最後の括弧。

複数候補のパターン検索で、 どちらがマッチしたかがわからないときに便利である。

(例)

/Version: (.*)|Revision: (.*)/ && ($rev = $+);

覚え方: ?
be positive and forward looking.

$* : 複数行パターンマッチングを行うか否か

$* : 複数行パターンマッチングを行うか否か

パターンマッチを最適化するために、 文字列内で複数行マッチングを行う時 1 にセットし、 文字列が 1 行しか含まないことを perl に知らせるために 0 をセットする。

$* を 0 にしていると、 newline を複数含む文字列に対するパターンマッチは混乱した結果を返すことがある。 デフォルトは 0 である。

覚え方:
`*' は複数にマッチする。

注意: この変数は ^$ の解釈にのみ影響を与える。 改行文字は $* == 0 であっても検索できる。

$0 : 実行している perl スクリプトのファイル名

$0 : 実行している perl スクリプトのファイル名。 $0 に代入を行なうと、ps(1) プログラムが参照する引数領域を変更する。

覚え方:
shksh と同じ。

$数字 : パターンマッチングの括弧の数に対応したサブパターン

$数字 : 最後に行ったパターンマッチの括弧の数に対応したサブパターン。

既に実行を終えたネストブロック内のパターンはカウントされない。

覚え方:
\数字 に似ている。

$[ : 配列の最初の要素や、サブストリングの最初の文字の添え字

$[ : 配列の最初の要素やサブストリングの最初の文字の添え字。

デフォルトは0 だが、perl を awk (または Fortran)のように動かしたければ、 添え字を使う時、 index()substr() を実行する時に 1 にセットすればよい。

覚え方:
`[' は添え字の始まり。

$] : バージョンを表す文字列

$] : `perl -v' を入力した時に出力される文字列。

スクリプトを実行している perl インタプリタが 正しいバージョンであるかどうかをスクリプトの最初で調べるのに使える。 数値のコンテキストで用いると、version + patchlevel / 1000 を返す。

(例)

# getc が使えるかどうか調べる
   ($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;

覚え方: ?
(Is this version of perl in the right bracket?)

$; : 多次元配列エミュレーションの際の添え字の区切り

$; : 多次元配列のエミュレーションの際の添え字の区切り。

連想配列の要素を

$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 と同じである。

連想配列のキーにバイナリーデータが含まれる場合は、 $; として安全な値はない。

覚え方:
コンマ(文法的な添え字区切り)はセミ-セミコロンである。 いや、ちょっと具合が悪いのはわかってるんだけど、 $, はもうほかのもっと重要なものに使ってしまったからね。

$! : errno の現在値またはシステムエラー文字列

$! : errno の現在値またはシステムエラー文字列

数値のコンテキストで使うと、 通常出される警告と共に errno の現在の値を返す。 (つまり、システムエラーを示す特定のエラーが返ったのでないかぎり、 $! の値は意味がないことになる。)

文字列のコンテキストで使うと、システムエラー文字列を返す。

errno をセットするために $! に代入することができる。

例えば、$! にエラー n に対応する文字列を入れて返す場合、 または die 関数の終了値をセットしたい場合、など。

覚え方:
What just went bang?

$@ : 最後に行った eval のシンタックスエラーメッセージ

$@ : 最後に行った eval コマンドのシンタックスエラーメッセージ。

ヌルならば、最後に行った eval は解析・実行が正しく行われたことを示す。 (起動した処理は普通に [in a normal fashion] 失敗したかもしれないが)

覚え方:
Where was the syntax error "at"?

$< : プロセスの実 uid

$< : プロセスの実 uid。

覚え方:
setuid スクリプトを走らせている場合、君はどこから来たのか?

$> : プロセスの実効 uid

$> : プロセスの実効 uid。

(例)

$< = $>;  # 実 uid を実効 uid にセットする
($<,$>) = ($>,$<);  # 実 uid と実効 uid を入れ替える

覚え方:
setuid スクリプトを走らせている場合、君はどこへ行ったのか?

(注意)
$<$> は、 setreuid() をサポートしているマシンでのみ swap できる。

$( : プロセスの実 gid

$( : プロセスの実 gid。

同時に複数のグループに属することをサポートするマシンでは、 スペースで区切られたユーザが属しているグループのリストとなる。 最初のものは getgid() で得られるものである。 残りは getgroups() で得られるものであり、 その内の一つは最初のものと同じかも知れない。

覚え方:
parentheses are used to GROUP things. The real gid is the group you LEFT, if you're running setgid.

$) : プロセスの実効 gid

$) : プロセスの実効 gid。

同時に複数のグループに属することをサポートするマシンでは、 スペースで区切られたユーザが属しているグループのリストとなる。 最初のものは getegid() で得られるものである。 残りは getgroups() で得られるものであり、 その内の一つは最初のものと同じかも知れない。

覚え方:
parentheses are used to GROUP things. The effective gid is the group that's RIGHT for you, if you're running setgid.

(注意)
$<$>$($)は対応する set[re][ug]id()ルーチンをサポートするマシンでのみ セットされる。 $($) は、 setregid() をサポートするマシンでのみ swap できる。

$: : format で文字列を分ける際の直前の文字列セット

$: : format で文字列を分ける際の直前の文字列セット

format において、文字列が分けられて継続フィールド (^ で始まる)に入る時のその直前の文字セット。 デフォルトは ` \n-' で、 文字列はホワイトスペース又はハイフンの後で分けられる。

覚え方:
a "colon" in poetry is a part of a line.

$^D : デバッグフラグの値

$^D : 現在のデバッグフラグの値。

覚え方:
-D スイッチの値。

$^F : システムファイルディスクリプタの最大値

$^F : システムファイルディスクリプタの最大値で、通常 2。

システムファイルディスクリプタは子プロセスに渡されるが、 それより値が大きいファイルディスクリプタは渡されない。 open の際には、 たとえ open が失敗してもシステムファイルディスクリプタは保存される。 通常のファイルディスクリプタは open を試みる前に close される。

覚え方:
-D スイッチの値。

$^I : ファイルをその場で変更する場合の拡張子の値

$^I : ファイルをその場で変更する場合の拡張子の値。

その場で変更するのを禁止するには、これを undef する。

覚え方:
-i スイッチの値。

$^P : デバッガ用内部フラグ

$^P : デバッガが自分自身をデバッグしないためにクリアする内部フラグ。

これをクリアすることで 自分自身をデバッグすることを不可能にすることが考えられる。

$^T : スクリプトの実行が始まった時刻

$^T : スクリプトの実行が始まった時刻(epoch からの秒数)。

ファイルテスト -M,-A,-C で返る値はこの値に基づいている。

$^W : 警告スイッチの値

$^W : 現在の警告スイッチの値。

覚え方:
-w スイッチに関連した値。

$^X : Perl が起動された際の名前

$^X : Perl そのものが起動された際の名前。argv[0] から得る。

$ARGV : <> から読み込んでいるときのカレントファイル名

$ARGV : <> から読み込んでいる時、カレントファイル名が入っている。

@ARGV : スクリプトに与えられたコマンドライン引数

@ARGV : スクリプトに与えられたコマンドライン引数。

$#ARGV は通常 引数の数 - 1 になっていることに注意。 なぜなら、$ARGV[0] は最初の引数であって、 コマンドの名前ではないからだ。 コマンド名を知るには $0 を見よ。

See section $0 : 実行している perl スクリプトのファイル名.

@INC : perl スクリプトを探す場所のリスト

@INC: perl スクリプトを探す場所のリスト

`do EXPR' コマンドまたは `require' コマンドで評価される。

最初は コマンドスイッチ -I で指定した引数 + デフォルト perl ライブラリ
(多分 `/usr/local/lib/perl'、 次に `.' すなわちカレントディレクトリ )が入っている。

%INC : インクルードしたファイルの位置

%INC : インクルードしたファイルの位置

連想配列 INC には do または require を用いて インクルードされたファイル名が入っている。 key は指定したファイル名、 value はファイルが実際に見つかった場所である。

`require' コマンドはこの配列を用いて 指定したファイルが既にインクルードされたかどうかを決定する。

%ENV : 環境変数

%ENV : 現在の環境。

ENV の値を変更すると、子プロセスの環境も変わる。

%SIG : signal ハンドラのリスト

%SIG : さまざまな signal に対応するハンドラをセットする。

(例)

sub handler {  # 1st argument is signal name
     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 スクリプトでセットされた signal に対応する値しか 含まない。

Go to the previous, next section.