NAME

perlvar - Perl で定義済みの変数

DESCRIPTION

変数名の文法

Perl の変数名は様々な形があります。 通常、変数名は英文字か下線で始まらなければならず、 任意の長さ(内部制限の 251 文字まで)を取ることができ、 英文字、数字、下線、特別な文字列である ::' を含むことができます。 この場合、最後の :: または ' の前は パッケージ限定子 として 扱われます; perlmod を参照して下さい。

Perl の変数は、数字の列または一文字の句読点かコントロール文字の 場合もあります(リテラルな制御文字の型式は廃止予定です)。 これらの名前は全て Perl によって特別な用途のために予約されています; 例えば、全て数字の名前は正規表現マッチの後の後方参照のデータを 保持するために用いられます。 Perl には一文字のコントロール文字の名前のための特別な文法があります: ^X(キャレット X)は control-X キャラクタを意味します。 例えば、$^W(ドル記号 キャレット W)は control-W 一文字の 名前をもつスカラ変数です。 これはプログラム中にリテラルな control-W をタイプするより 良いです。

Perl v5.6.0 から、キャレット(あるいは制御文字ですが、この型式は 廃止予定です)で始まる、英数字からなる文字列の変数名も使えます。 これらの変数は ${^Foo} の形で書かれなければなりません; 括弧は必須です。 ${^Foo} はコントロール-F の後に二つ o が続く名前を持つ スカラ変数です。 これらの変数は Perl によって特別な用途のために予約されていますが、 ^_ (コントロール-下線またはキャレット-下線)で始まるものは例外です。 ^_ で始まるコントロール文字名は Perl の将来のバージョンで特別な意味を 持つことはありません; 従ってこれらの名前はプログラム中で安全に使用できます。 但し、$^_ そのものは 予約されます

数字、コントロール文字、句読点で始まる Perl の識別子は package 宣言の 効果から逃れて、常に main パッケージにあるものとして扱われます。 さらに以下のものも逃れます:

    ENV      STDIN
    INC      STDOUT
    ARGV     STDERR
    ARGVOUT
    SIG

特に、新しい特別な ${^_XYZ} 変数はスコープ内の package 宣言に関わらず 常に main パッケージとして扱われます。

特殊変数

以下の名前は Perl では特別な意味を持ちます。 記号的な名前の多くは記憶法があるか、シェルでの類推が可能です。 それでも長い名前を使用したい場合には

    use English;

とプログラムの最初に書いてください。 これは、すべての短い名前の別名として、 カレントパッケージで長い名前を付けるものです。 awk から持ってきた中間的な名前を持っているものもあります。 さらなる情報については、どうか English を参照してください。

先に進む前に、変数のソート順に注意してください。 一般的に、変数を大文字小文字を無視して、ほとんど辞書順に並んでいます (${^UNICODE}$^T のように、先頭についている {^ は 無視します)が、$_@_ は先頭に来ます。 同じ識別子を持つ変数については、スカラ、配列、ハッシュ、裸の単語の順に 並べています。

一般変数

$ARG
$_

デフォルトの入力とパターン検索のスペース。 以下の 2つは同値です:

    while (<>) {...}    # while の中でのみ等価!
    while (defined($_ = <>)) {...}

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

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

    chomp
    chomp($_)

あなたが使いたくなくても Perl が $_ を仮定する場合がいくつかあります:

$_ はグローバル変数です。 しかし、perl v5.10.0 から、ファイルやブロックで my で宣言することで、 レキシカル版の $_ が使えます。 さらに、our $_ という宣言は現在のスコープでグローバルな $_ を 再構築します。 これは導入した時点ではいい考えに思えましたが、実際にはレキシカルな $_ は 解決するものよりも多くの問題を引き起こします。 $_ 経由で情報が渡されると想定している関数を呼び出すとき、関数の 書かれ方によって動作したりしなかったりします; これを解決する簡単な方法は ありません。 自分が特にマゾと言うのでない限り、単にレキシカルな $_ を使うのを 避けてください。 この理由により、レキシカルな $_ は実験的なままで、警告を無効にしない限り 警告が出力されます。 他の実験的機能と同様、レキシカルな $_ の振る舞いは(致命的エラーへの変更を 含めて)通知なく変更される可能性があります。

記憶法: 下線はある操作を覚えるためのもの。

@ARG
@_

サブルーチンに入るときには、配列 @_ はサブルーチンに渡された パラメータです。 サブルーチンの内部では、@_ は配列演算子 push, shift の デフォルト配列です。

perlsub を参照して下さい。

$LIST_SEPARATOR
$"

配列や配列スライスがダブルクォートされた文字列あるいは /.../ のような 同様のコンテキスト展開されたとき、その要素はこの値で分割されます。 デフォルトは空白です。 例えば、以下のものは:

    print "The array is: @array\n";

以下と等価です:

    print "The array is: " . join($", @array) . "\n";

記憶法: ダブルクォートされた内容に対して動作します。

$PROCESS_ID
$PID
$$

このスクリプトを実行している 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 の意味論を保存します。

記憶法: シェルと同じ。

$PROGRAM_NAME
$0

実行されているプログラムの名前を示します。

一部の(しかし全てではありません)オペレーティングシステムでは $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 v5.14.0 以降、perl がバージョン 4.000 以降行っていた argv[0] 経由での POSIX 名の置き換えに加えて、 レガシープロセス名は prctl(2) で設定されます。 今では ps, top, killall のようにレガシープロセス名を読むユーティリティは $0 に代入することに設定される名前を認識します。 指定した文字列は 16 バイトに切り詰められます; これは Linux による 制限です。

記憶法: shksh と同じ。

$REAL_GROUP_ID
$GID
$(

本プロセスの実 gid を示します。 同時に複数のグループに所属できるマシンでは、所属するグループをスペースで 区切ったリストが得られます。 最初の数値は、getgid() で返されるものです; その後に getgroups() が 返す値が続き、その中の 1 つは、最初の値と同じかもしれません。

しかし、$( に代入された値は実際の gid に設定された値の 一つでなければなりません。 従って、 $( で与えられた値はゼロを足すことによって 数値化することなく $( に書き戻すべきではありません。 これはリストが得られる実行 GID ($)) とは違うことに注意してください。

POSIX::setgid() を使って、実 GID と実効 GID の両方を同時に変更できます。 $( を変更した場合は、変更しようとしたときに起こりうるエラーを検出するために $! をチェックする必要があります。

記憶法: 括弧は、グループ化に使われます。 setgid で実行中であれば、実 gid は left した、つまり離れたグループです。

$EFFECTIVE_GROUP_ID
$EGID
$)

本プロセスの実効 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 な、つまり正しいグループです。

$REAL_USER_ID
$UID
$<

本プロセスの実 uid を示します。 POSIX::setuid() を使って、実効 UID と実 UID を同時に変更できます。 $< の変更にはシステムコールが必要なので、起こりうるエラーを 検出するために $! のチェックが必要です。

記憶法: setuid で実行中であれば、そこ「から」来た uid です。

$EFFECTIVE_USER_ID
$EUID
$>

本プロセスの実効 uid を示します。 例えば:

    $< = $>;            # 実 uid に実効 uid を設定
    ($<,$>) = ($>,$<);  # 実 uid と実効 uid を交換

POSIX::setuid() を使って、実効 UID と実 UID を同時に変更できます。 $> を変更した場合は、変更時に起こりうるエラーを検出するために $! のチェックが必要です。

$<$> の交換は、setreuid() をサポートしている マシンでのみ可能です。

記憶法: setuid で実行中であれば、そこ 行く uid です。

$SUBSCRIPT_SEPARATOR
$SUBSEP
$;

多次元配列のエミュレートのための添え字の区切文字。 ハッシュの要素を

    $foo{$x,$y,$z}

のようにして参照すると、実際には以下のようになります

    $foo{join($;, $x, $y, $z)}

しかし、以下のようにしてはいけません

    @foo{$x,$y,$z}      # スライス--@ に注意

これは以下の意味になります

    ($foo{$x},$foo{$y},$foo{$z})

デフォルトは "\034" で、awk の SUBSEP と同じです。 使おうとしている key の値がバイナリのデータを含むならば、 $; に設定する安全な値などはないことになります。

perllol で記述している「本物の」多次元配列を使うようにしてください。

記憶法: コンマ (構文上の添え字区切り文字) はセミ−セミコロンなのです。

$a
$b

sort() を使うときの特殊パッケージ変数です; "sort" in perlfunc を 参照してください。 この特殊性により、$a$b は、たとえ strict 'vars' プラグマを 使っているときでも (use varsour() を使って) 宣言する必要が ありません。 これを sort() 比較ブロックや関数で使えるようにしたい場合は、 my $amy $b としてレキシカル化しないでください。

%ENV

ハッシュ %ENV には、その時点の環境変数が設定されています。 ENV に値を設定することで、 以後に fork() した子プロセスの環境変数を変更します。

v5.18.0 から、%ENV に補完されたキーと値の両方は文字列化されます。

    my $foo = 1;
    $ENV{'bar'} = \$foo;
    if( ref $ENV{'bar'} ) {
        say "Pre 5.18.0 Behaviour";
    } else {
        say "Post 5.18.0 Behaviour";
    }

以前は、子プロセスのみが文字列化された値を受け取っていました:

    my $foo = 1;
    $ENV{'bar'} = \$foo;

    # Always printed 'non ref'
    system($^X, '-e',
           q/print ( ref $ENV{'bar'}  ? 'ref' : 'non ref' ) /);

これは、外部プロセスと本当に任意のデータ構造を共有することができないために 起きます。

$OLD_PERL_VERSION
$]

5.XXXYYY 型式の小数で表現される Perl インタプリタの revision, version, subversion (XXX は version / 1e3、 YYY は subversion / 1e6)。 例えば、、Perl v5.10.1 は "5.010001" です。

スクリプトの最初で、そのスクリプトを実行しているインタプリタのバージョンが 適切な範囲内にあるかを調べる、といったことができます:

    warn "No PerlIO!\n" if $] lt '5.008';

$] と比較する場合は、文字列比較演算子を 強く勧めます 。 バイナリ浮動小数点表現が生来持つ制限により、アーキテクチャと数値によっては 比較が正しくないことがあります。

実行する Perl インタプリタが古すぎる場合に終了する便利な方法に ついては use VERSIONrequire VERSION のドキュメントも 参照して下さい。

より柔軟な文字列比較が可能な version オブジェクトとしての Perl バージョン表現については "$^V" を参照してください。

$^V に対する $] の主な利点は、どのバージョンの Perl でも同様に 動作することです。 欠点は、他の型式のバージョン (例えばリテラルな v-文字列、"v1.2.3"、 バージョンオブジェクト) と簡単に比較できず、数値比較はときどき 失敗することです; 文字列リテラルバージョンチェックとしては良いですが、 正気チェックをされていない変数と比較するには良くないです。

$OLD_PERL_VERSION 型式は歴史的理由により Perl v5.20.0 に追加されましたが、 この使用は非推奨です。 ($] を使う理由が古い perl でコードを実行することなら、これを $OLD_PERL_VERSION して参照すると自滅することになります。)

記憶法: Perl のバージョンは、正しい範囲 (right bracket) にあるか。

$SYSTEM_FD_MAX
$^F

システムが使用するファイル記述子の最大値を示し、通常は 2 です。 システムファイル記述子は、exec() されたプロセスに渡されますが、 それ以降のファイル記述子は渡されません。 また、open() の実行中は、システムファイル記述子は、 たとえ open() が失敗しても、保存されます (通常のファイル記述子は、open() が実行される前にクローズされます)。 ファイル記述子の close-on-exec のステータスは、exec() 時ではなく、 対応するファイル、パイプソケットの open 時の $^F の値によって 決められます。

@F

自動 split モードが有効の場合、配列 @F には読み込んだ行のフィールドを 含みます。 -a オプションについては perlrun を参照してください。 この配列はパッケージ固有であり、もし strict 'vars' で実行していて パッケージ main 以外の場合は完全なパッケージ名で定義したり与えたり しなければなりません。

@INC

配列 @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

ハッシュ %INC は、do, require, use 演算子によって インクルードされた、個々のファイル名をエントリとして持っています。 key は指定したファイル名(モジュール名はパス名に変換されます)で、 value は見つかった場所となっています。 require 演算子は、指定されたファイル名が既に インクルードされているかを、このハッシュを使って調べます。

ファイルがフック(つまりサブルーチンリファレンス; フックに関する 説明については "require" in perlfunc を参照してください)経由で読み込まれた 場合、このフックはデフォルトではファイル名の代わりに %INC に挿入されます。 しかし、フックはさらなる特定の情報を提供するために、自身で %INC エントリを セットするかもしれないことに注意してください。

$INPLACE_EDIT
$^I

置き換え編集の拡張子の値を示します。 置き換え編集を禁止するためには、undef を設定します。

記憶法: -i スイッチの値。

$^M

デフォルトでは、メモリ不足はトラップできない致命的エラーとなります。 しかし、もし適切に構築されていれば、Perl は $^M の中身を die() した後の緊急用メモリとして使えます。 Perl が -DPERL_EMERGENCY_SBRK 付きでコンパイルされ、 Perl の malloc を使うと仮定します。そして、

    $^M = 'a' x (1 << 16);

とすると緊急用の 64K のバッファを割り当てます。 perl をコンパイルするときに独自の C コンパイルフラグを追加する 方法についての情報は、Perl 配布パッケージに含まれている INSTALL ファイルを参照して下さい。 この拡張機能を気軽に使えないようにするために、 この変数には English の長い名前はありません。

この変数は Perl 5.004 で追加されました。

$OSNAME
$^O

この Perl が構築されたオペレーティングシステムの名前です; これは設定プロセス中に決定されます。 例えば "PLATFORMS" in perlport を参照してください。

この値は $Config{'osname'} と同じです。 Config と、perlrun で文書化されている -V コマンドラインスイッチも参照して下さい。

Windows プラットフォームでは、$^O はあまり役に立ちません: これは常に MSWin32 となり、95/98/ME/NT/2000/XP/CE/.NET の違いを示していないからです。 これらを区別するためには、Win32::GetOSName() や Win32::GetOSVersion() を 使ってください (Win32perlport を参照してください)。

この変数は Perl 5.003 で追加されました。

%SIG

ハッシュ %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 v5.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 を参照して下さい。

$BASETIME
$^T

プログラムを実行開始した時刻を、紀元 (1970年の始め) からの秒数で 示したものです。 ファイルテスト -M-A-C で返される値は、この値に基づいています。

$PERL_VERSION
$^V

version オブジェクトとして表現される Perl インタプリタの revision, version, subversion。

この変数は perl v5.6.0 で最初に現れました; それより前のバージョンでは 未定義値となります。 perl v5.10.0 以前では $^Vversion オブジェクトではなく v-string 形式で表現されます。

$^V はスクリプトを実行している Perl インタプリタのバージョンが 正しい範囲に入っているかを調べるのに使えます。 例えば:

    warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1

移植性がある形で $^V を文字列表現に変換するために、 バージョンオブジェクトは文字列化をオーバーロードしますが、 v-文字列とバージョンオブジェクトの療養で動作する sprintf()"%vd" 変換を使ってください。

    printf "version is v%vd\n", $^V;  # Perl のバージョン

実行する Perl インタプリタが古すぎる場合に終了する便利な方法については use VERSIONrequire VERSION のドキュメントを参照して下さい。

Perl バージョンの 10 進表現については $] も参照して下さい。

Perl 5.10.0 以降での、$] に対する $^V の主な利点は、これは演算子を オーバーロードするので、他のバージョン表現 (例えば 10 進数、 リテラルな v-文字列、"v1.2.3"、オブジェクト)との比較が簡単であることです。 v5.10.0 より前での欠点は、これは単なるリテラルな v-文字列であるため、 簡単に表示したり比較したり出来ないことです。

記憶法: ^V をバージョンオブジェクトに使います。

${^WIN32_SLOPPY_STAT}

この変数が真の値にセットされると、Windows での stat() はファイルを オープンしようとはしません。 これは、このファイルへの追加のハードリンクが存在する場合、リンクカウントを 決定できませんし、ファイル属性が古いものになるかもしれないことを意味します。 一方、ファイルを開かないので、(特にファイルがネットワークドライブにある 場合は)大幅に高速です。

デフォルトで「ずさんな」stat() を使うために、この変数は、ローカルな Perl を設定するための sitecustomize.pl で設定できます。 サイトカスタマイズに関するさらなる情報については perlrun-f を参照してください。

この変数は Perl v5.10.0 で追加されました。

$EXECUTABLE_NAME
$^X

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 での 等価物) をコードのどこかで使うと、コードが引き続いてこれらの変数に アクセスするかもしれないので、引き続くすべての成功したパターンマッチングで マッチングした文字列のコピーを作ります。 これはプログラム全体に対してかなりの性能上の負荷を掛けるので、、一般的に これらの変数の使用は非推奨です。

Perl 5.6.0 では、マッチングに成功したインデックスを提供する @-@+ 動的配列が導入されました。 それで、たとえばこのようにできます:

    $str =~ /pattern/;

    print $`, $&, $'; # bad: perfomance hit

    print             # good: no perfomance hit
        substr($str, 0,     $-[0]),
        substr($str, $-[0], $+[0]-$-[0]),
        substr($str, $+[0]);

Perl 5.10.0 で /p マッチング演算子フラグと ${^PREMATCH}, ${^MATCH}, ${^POSTMATCH} 変数が導入され、/p でマークされた パターンのみが負荷を被るようにできるようになりました。

Perl 5.18.0 以降では、perl は三つの変数の存在を別々に注意するようになり、 必要な部分文字列のみをコピーするようになりました; 従って、次の場合は

    $`; $&; "abcdefgh" =~ /d/

perl は文字列のうち "abcd" の部分のみをコピーします。 これは次のようなものとは大きな違いになります

    $str = 'x' x 1_000_000;
    $&; # whoops
    $str =~ /x/g # one char copied a million times, not a million chars

Perl 5.20.0 では新しいコピーオンライトシステムがデフォルトで有効になり、 これらの変数に関する性能問題はすべて最終的に修正され、これらをどこで使っても 安全になりました。

Devel::NYTProfDevel::FindAmpersand のモジュールは、コード中に これらの問題のあるマッチング変数の使用を探す助けになります。

$<digits> ($1, $2, ...)

最後に成功したパターンマッチングで対応する括弧のサブパターンにマッチングした 文字列が入っているが、既に抜けてしまったブロックでの パターンマッチングは勘定に入れません。

これらの変数はすべて読み込み専用で、動的なスコープを持ちます。

記憶法: \(数字) のようなもの。

$MATCH
$&

最後に成功したパターンマッチでマッチした文字列 (現在の BLOCK で囲まれた BLOCK や eval() で隠れている部分でのマッチは勘定に入れません)。

この変数を(一度でも)使うことによる重大な性能の問題については前述した "Performance issues" を参照してください。

この変数は読み込み専用で動的スコープを持ちます。

記憶法: あるエディタの & ようなもの。

${^MATCH}

これは $& ($MATCH) と同様ですが、この変数と関連付けられた性能上の ペナルティを被りません。

前述した "Performance issues" を参照してください。

Perl v5.18 以前では、パターンが /p 修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。 Perl v5.20 では、/p 修飾子は何もしないので、${^MATCH}$MATCH と 同じです。

この変数は Perl v5.10.0 で追加されました。

この変数は読み込み専用で動的スコープを持ちます。

$PREMATCH
$`

最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に 隠れている部分でのマッチは勘定に入れません) でマッチした部分の前の文字列。

この変数を(一度でも)使うことによる重大な性能の問題については前述した "Performance issues" を参照してください。

この変数は読み込み専用で動的スコープを持ちます。

記憶法: ` は多くの場合クォートされた文字列の前にある。

${^PREMATCH}

これは $` ($PREMATCH) と同様ですが、この変数と関連付けられた性能上の ペナルティを被りません。

前述した "Performance issues" を参照してください。

Perl v5.18 以前では、パターンが /p 修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。 Perl v5.20 では、/p 修飾子は何もしないので、${^PREMATCH}$PREMATCH と同じです。

この変数は Perl v5.10.0 で追加されました。

この変数は読み込み専用で動的スコープを持ちます。

$POSTMATCH
$'

最後の成功したパターンマッチ (現在のBLOCK で囲まれた BLOCK や eval() に 隠れている部分でのマッチは勘定に入れない) でマッチした部分に続く文字列。 例:

    local $_ = 'abcdefghi';
    /def/;
    print "$`:$&:$'\n";         # abc:def:ghi を表示

この変数を(一度でも)使うことによる重大な性能の問題については前述した "Performance issues" を参照してください。

この変数は読み込み専用で動的スコープを持ちます。

記憶法: ' は多くの場合クォートされた文字列の後にある。

${^POSTMATCH}

これは $' ($POSTMATCH) と同様ですが、この変数と関連付けられた性能上の ペナルティを被りません。

前述した "Performance issues" を参照してください。

Perl v5.18 以前では、パターンが /p 修飾子付きでコンパイルまたは実行された 場合にのみ定義された値を返すことが保証されます。 Perl v5.20 では、/p 修飾子は何もしないので、${^POSTMATCH}$POSTMATCH と同じです。

この変数は Perl v5.10.0 で追加されました。

この変数は読み込み専用で動的スコープを持ちます。

$LAST_PAREN_MATCH
$+

最後に検索されたパターンの最後の括弧にマッチした文字列。 これはいくつかの選択肢の中でどれがマッチするのか わからないような場合に使うと便利です。 例えば:

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

この変数は読み込み専用で動的スコープを持ちます。

記憶法: ポジティブで前向き。

$LAST_SUBMATCH_RESULT
$^N

最近のマッチングに成功した検索パターンのうち、一番最近に閉じられた使われた グループ(つまり、一番右の閉じかっこのグループ)にマッチングしたテキスト。

これは主として最近マッチしたテキストを調べるために (?{...}) ブロックの 中で使われます。 例えば、($1, $2 などに加えて) テキストを変数に効率的に捕捉するには、 (...) を以下で置き換えます:

    (?:(...)(?{ $var = $^N }))

$var をこの方法で設定してから使うことで、かっこの組の番号について 気にしなくてすむようになります。

この変数は Perl v5.8.0 で追加されました。

記憶法: もっとも最近閉じられた、(おそらく) ネストした (Nested) かっこ。

@LAST_MATCH_END
@+

この配列は、現在アクティブな動的スコープで最後に成功した部分マッチングの 最後へのオフセットを保持します。 $+[0] はマッチ全体の文字列の最後へのオフセットです。 これはマッチした変数に対して pos 関数を呼び出したときの返り値と同じです。 この配列の n 番目の要素は n 番目のサブマッチのオフセットを 保持しているので、$+[1] は過去の $1 の終わりのオフセット、$+[2]$2 のオフセット、という形になります。 $#+ は最後に成功したマッチでいくつサブグループがあるかを決定するのに 使えます。 @- 変数の例を参照して下さい。

この変数は Perl v5.6.0 で追加されました。

%LAST_PAREN_MATCH
%+

@+ と同様、%+ ハッシュは、現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉バッファ(存在すれば)へのアクセスを可能にします。

例えば、$+{foo} は以下のマッチングの後の $1 と等価です:

    'foo' =~ /(?<foo>foo)/;

%+ ハッシュのキーは捕捉された(従って定義された値と結びついている) バッファの名前のみの一覧です。

%+ の基礎となる振る舞いは Tie::Hash::NamedCapture モジュールで 提供されています。

注意: %- and %+ は最後に成功した正規表現と関連付けられた共通の 内部ハッシュと tie されたビューです。 従って、each 経由で混ざった反復アクセスを行うと、予測不能の結果となります。 同様に、最後に成功したマッチングを変更すると、結果は驚くべきものとなります。

この変数は Perl v5.10.0 で追加されました。

この変数は読み込み専用で動的スコープを持ちます。

@LAST_MATCH_START
@-

$-[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]) と同じです
$1substr($var, $-[1], $+[1] - $-[1]) と同じです
$2substr($var, $-[2], $+[2] - $-[2]) と同じです
$3substr $var, $-[3], $+[3] - $-[3]) と同じです

この変数は Perl v5.6.0 で追加されました。

%LAST_MATCH_START
%-

%+ と同様、この変数は現在アクティブな動的スコープで最後に成功した マッチングの名前付き捕捉グループへのアクセスを可能にします。 正規表現中に捕捉グループ名が現れるごとに、その名前のグループ全てで (複数あるでしょう)捕捉されている値のリストを出現順で含む配列への リファレンスと関連付けられます。

以下は例です:

    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 v5.10.0 で追加されました。

この変数は読み込み専用で動的スコープを持ちます。

$LAST_REGEXP_CODE_RESULT
$^R

最後に成功した (?{ code }) 正規表現アサートの評価の結果です (perlre を参照して下さい)。おそらくもっと書き足します。

この変数は Perl 5.005 で追加されました。

${^RE_DEBUG_FLAGS}

正規表現デバッグフラグの現在の値です。 0 をセットすると、re 'debug' モジュールが読み込まれていてもデバッグ出力を 行いません。 詳細については re を参照してください。

この変数は Perl v5.10.0 で追加されました。

${^RE_TRIE_MAXBUF}

どれくらい正規表現の最適化を行い、どれくらいのメモリを利用するかを制御します。 デフォルトではこの値は 65536 で、512kB の一時キャッシュに相当します。 この値を大きくすると、大きなものとマッチングするときに速度を重視して多くの メモリを使います。 もしできるだけ保守的なメモリ消費をするけれども使うこともある、というように 最適化したい場合は小さい値を設定します; 負の値を設定すると最適化は行わず、 最大限メモリを節約します。 通常の状況では、この変数はあなたの興味を引くものではないでしょう。

この変数は Perl v5.10.0 で追加されました。

現在選択されているファイルハンドルに依存する変数の場合には、代わりに 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

配列 @ARGV は、コマンドラインからスクリプトに渡す引数が入れられます。 $ARGV[0]プログラムのコマンド名自身ではなく、 最初の引数ですから、$#ARGV は一般には、引数の個数 - 1 となります。 コマンド名については、"$0" を参照してください。

ARGV

@ARGV にあるコマンドラインで指定されたファイル名に対して反復する 特殊ファイルハンドルです。 通常角かっこ <> の中で空ファイルハンドルとして書かれます。 現在のところ、ARGV<> 演算子の中でのみ特別な効果があることに 注意してください; その他の場所では、<> で開かれた最後のファイルに 対応する普通のファイルハンドルです。 特に、ファイルハンドルを想定している関数に \*ARGV を引数として渡しても、 関数内で @ARGV にある全てのファイルの内容を自動的に読み込むことには なりません。

ARGVOUT

-i を使ってその場修正を行っているときに、現在開いている出力ファイルを 示す特殊ファイルハンドルです。 たくさんの挿入をする必要があるときに $_ を修正し続けたくない場合に有用です。 -i オプションについては perlrun を参照してください。

IO::Handle->output_field_separator( EXPR )
$OUTPUT_FIELD_SEPARATOR
$OFS
$,

print 演算子のための出力フィールドセパレータ。 定義されると、この値がそれぞれの print の引数の間に表示されます。 デフォルトは undef です。

ハンドルに対して output_field_separator() を呼び出すことはできません; 静的メソッドしてのみです。 IO::Handle を参照してください。

記憶法: print 文で "," を書いた場所に印字されるもの。

HANDLE->input_line_number( EXPR )
$INPUT_LINE_NUMBER
$NR
$.

最後にアクセスされたファイルハンドルの現在の行番号。

Perl の各ファイルハンドルは、そこから読み込んだ行数を数えています。 ($/ の値に依存して、何が行を構成するかに関する Perl の考えはあなたの 考えと一致しないかもしれません。) 行が(readline()<> を使って)ファイルハンドルから読み込まれたか、 tell()seek() がファイルハンドルに対して呼び出された場合、 $. はそのファイルハンドルの行カウンタへのエイリアスとなります。

$. へ代入することでカウンタの値を修正できますが、これは実際にシーク ポインタを動かすことはありません。 $. をローカル化してもファイルハンドルの行カウンタはローカル化されません。 代わりに、現在 $. がどのファイルハンドルへのエイリアスかという情報が ローカル化されます。

$. はファイルハンドルがクローズされるとリセットされますが、 オープンしているファイルハンドルが close() されることなく再オープンされた 場合にはリセット されません。 さらなる詳細については、"I/O Operators" in perlop を参照してください。 なぜなら、 <> は決して明示的なクローズは行わず、行番号は ARGV の ファイル間で通算してカウントされるからです(但し "eof" in perlfunc の例を 参照してください)。

また、HANDLE->input_line_number(EXPR) とすることで、どのハンドルに 最後にアクセスしたかを気にすることなく行カウンタにアクセスできます。

記憶法: 多くのプログラムで "." が現在行番号を示すように使われています。

IO::Handle->input_record_separator( EXPR )
$INPUT_RECORD_SEPARATOR
$RS
$/

入力レコードセパレータで、デフォルトでは改行文字。 これは 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>;

これは $fh から 32768 文字を超えないようにレコードを読み込みます。 もしレコード指向のファイルを読み込まない場合(あるいは OS がレコード指向 ファイルを持たない場合)、読み込み毎にデータのチャンク全部を取り込みます。 もしレコードがセットしたレコードサイズより大きい場合、 レコードの部分を取り込みます。 レコードサイズを 0 以下にセットしようとするのは廃止予定で、 $/ に値 "undef" が設定され、(残りの)ファイル全体を読み込むことになります。

5.19.9 から、$/ にその他の形式のリファレンスを設定すると致命的エラーが 投げられます。 これは将来 $/ を設定する新しい方法に対応する準備です。

VMS だけでは、レコードは PerlIO 層とそれに関連するバッファリングを迂回して 読み込まれるので、同じファイルハンドルでレコード読み込みと 非レコード読み込みを混ぜてはいけません。 レコードモードは、同じバッファリング層を両方のモードで使う場合にのみ ラインモードと混ざります。

ハンドルに対して input_record_separator() を呼び出すことはできません; 静的メソッドしてのみです。 IO::Handle を参照してください。

"Newlines" in perlport を参照してください。 "$." も参照してください。

記憶法: /は、詩を引用するときに、行の区切りを示します。

IO::Handle->output_record_separator( EXPR )
$OUTPUT_RECORD_SEPARATOR
$ORS
$\

print 演算子のための出力レコードセパレータ。 もし定義されていると、print の最後の引数の最後にこの値が表示されます。 デフォルトは undef です。

ハンドルに対して output_record_separator() を呼び出すことはできません; 静的メソッドしてのみです。 IO::Handle を参照してください。

記憶法: print の最後に "\n" を付け加える代わりに $\ を設定する。 また、$/ に似通っているが、Perl から「バック」されるものです。

HANDLE->autoflush( EXPR )
$OUTPUT_AUTOFLUSH
$|

0 以外に設定されると、その時点で選択されている出力チャネルを直ちにその場で フラッシュし、さらに write や print を行なうごとに、強制的にフラッシュします。 デフォルトでは 0 となっています(チャンネルが実際にシステムによって バッファリングされているかどうかは関知しません。 $| は Perl が明示的に毎回書き込みの後にフラッシュするかどうかのみを 示します)。 STDOUT は通常では、端末への出力時には行バッファリング、 それ以外ではブロックバッファリングであることに注意してください。 これは、Perl のスクリプトを rsh 配下で実行して、実行状況を確認したい 場合のように、パイプやソケットに出力するときに特に便利でしょう。 これは入力バッファリングには何の影響も与えません。 出力チャネルの選択方法については "select" in perlfunc を参照してください。 IO::Handle も参照してください。

記憶法: パイプをホットな状態にしておくために使う。

${^LAST_FH}

この読み込み専用変数は最後に読み込んだファイルハンドルへのリファレンスを 含んでいます。 これは <HANDLE>, readline, tell, eof, seek で 設定されます。 これは $. および、telleof が引数なしで使われたときと同じ ハンドルです。 これはまた、Perl がエラーまたは警告メッセージに ", <STDIN> line 1" を追加する ハンドルでもあります。

この変数は Perl v5.18.0 で追加されました。

フォーマットのための特殊変数はファイルハンドルのための物のサブセットです。 Perl のフォーマットに関するさらなる情報については perlform を 参照してください。

$ACCUMULATOR
$^A

format() 行のための、その時点での write() アキュムレータの値。 format には、$^A に結果を残す、formline() 呼び出しが含まれます。 自分のフォーマットを呼び出した後で、 write()$^A の内容を出力してから消去します。 したがって、自分で formline() を呼び出すのでなければ、 $^A の値が見えることはありません。 perlform"formline PICTURE,LIST" in perlfunc を参照してください。

IO::Handle->format_formfeed(EXPR)
$FORMAT_FORMFEED
$^L

フォーマット出力で、改ページのために出力されるもの。 デフォルトは \f

ハンドルに対して format_formfeed() を呼び出すことはできません; 静的メソッドしてのみです。 IO::Handle を参照してください。

HANDLE->format_page_number(EXPR)
$FORMAT_PAGE_NUMBER
$%

その時点で選択されている出力チャネルの、その時点でのページ番号。

記憶法: % は、nroff でのページ番号です。

HANDLE->format_lines_left(EXPR)
$FORMAT_LINES_LEFT
$-

その時点で選択されている出力チャネルの、ページに残っている行数。

記憶法: "ページ行数" - "印字済み行数"

IO::Handle->format_line_break_characters EXPR
$FORMAT_LINE_BREAK_CHARACTERS
$:

フォーマットの充填継続フィールド (^ で始まるもの) への文字列で行分割を許す 文字集合。 デフォルトは " \n-" で空白、改行、ハイフンの後で行分割が可能です。

ハンドルに対して format_line_break_characters() を呼び出すことはできません; 静的メソッドしてのみです。 IO::Handle を参照してください。

記憶法: 詩では「コロン」は、行の一部。

HANDLE->format_lines_per_page(EXPR)
$FORMAT_LINES_PER_PAGE
$=

その時点で選択されている出力チャネルの、その時点でのページ長(印字可能行数)。 デフォルトは 60 です。

記憶法: = には複数の水平線 (行) が含まれます。

HANDLE->format_top_name(EXPR)
$FORMAT_TOP_NAME
$^

その時点で選択されている出力チャネルの、その時点でのページ先頭フォーマット名。 デフォルトは、ファイルハンドル名に _TOP を続けたものです。 例えば、STDOUT ファイルハンドルのデフォルトのページ先頭フォーマット名は STDOUT_TOP です。

記憶法: ページの先頭へのポインタ。

HANDLE->format_name(EXPR)
$FORMAT_NAME
$~

その時点で選択されている出力チャネルの、その時点でのフォーマット名。 デフォルトは、ファイルハンドル名です。 例えば、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 された文字列がコンパイルされなかったとき(これは openclose が正しくないプロトタイプでインポートされたときに起こり得ます)、 または評価中に実行している Perl コードが die() したときにセットされます。 これらの場合には $@ の値はコンパイルエラー、または die への引数(これには $!$? が差し挟まれます)です。 (しかし、Fatal も参照して下さい。)

いくつかのオペレーティングシステムでは、$^E により詳細なエラー指示子が 入っているかもしれません; 今回の場合で言えば、 "CDROM tray not closed." などです。 追加のエラーメッセージに対応していないシステムでは、$^E$! と同じ 値です。

最後に、$? は外部プログラム /cdrom/install が失敗したときに 非 0 にセットされるかもしれません。 上位の 8 ビットはプログラムが遭遇した特定のエラー状況 (プログラムの exit() の値)を反映します。 下位の 8 ビットは、シグナルの死亡やコアダンプ情報と言った失敗のモードを 反映します。 詳細については wait(2) を参照して下さい。 $!$^E はエラー状況が検出されたときにのみ設定されますが、 変数 $?wait やパイプの close の度に、前の値を上書きします。 これは、$@eval() の実行毎に、エラーならセットされ、 成功ならクリアされるという動作と似ています。

より詳細については、$@, $!, $^E, $? それぞれの説明を 参照して下さい。

${^CHILD_ERROR_NATIVE}

最後のパイプクローズ、逆クォート (``) コマンド、wait()waitpid() の成功した呼び出し、system() 演算子から返された、 ネイティブなステータスです。 POSIX 風システムでは、この値は POSIX モジュールで提供される WIFEXITED, WEXITSTATUS, WIFSIGNALED, WTERMSIG, WIFSTOPPED, WSTOPSIG, WIFCONTINUED 関数でデコードできます。

VMS ではこれは実際の VMS の終了ステータスを反映します; 言い換えると、これは use vmsish 'status' プラグマが有効なときの $? と 同じです。

この変数は Perl v5.10.0 で追加されました。

$EXTENDED_OS_ERROR
$^E

現在のオペレーティングシステムに特化したエラー情報です。 現在のところ、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)エラーの説明。

$EXCEPTIONS_BEING_CAUGHT
$^S

現在のインタプリタの状態を示します。

        $^S         状態
        ---------   -------------------
        undef       モジュール、eval、メインプログラムのパース中
        真 (1)      eval の実行中
        偽 (0)      その他

最初の状態は $SIG{__DIE__}$SIG{__WARN__} のハンドラで起きる 可能性があります。

英語名 $EXCEPTIONS_BEING_CAUGHT は少し誤解を招きます; undef は例外が 捕捉されたかどうかを示しているわけではないからです; メインプログラムの コンパイルは例外を捕捉しません。

この変数は Perl 5.004 で追加されました。

$WARNING
$^W

警告スイッチの値で、-w スイッチが使われると内部的に真となり、 そうでない場合は直接変更可能です。

warnings も参照して下さい。

記憶法: -w スイッチに関係します。

${^WARNING_BITS}

use warnings プラグマで有効にされた、現在の警告チェックの集合です。 $^H および %^H 変数と同じスコープを持ちます。 正確な値は warnings プラグマの内部の値と考えられ、Perl の バージョンによって変更されるかもしれません。

この変数は Perl v5.6.0 で追加されました。

$OS_ERROR
$ERRNO
$!

参照されると、$! は C の errno 正数変数の現在の値を取得します。 $! に数値が代入されると、その値は errno に補完されます。 文字列として参照されると、$!errno に対応するシステムエラー 文字列を返します。

多くのシステムやライブラリ呼び出しは、失敗したときに、失敗の理由を示すために errno を設定します。 これらは普通は成功したときには errno にゼロを設定 しません。 これは、errno$! は、失敗直後 でのみ意味が あるということです:

    if (open my $fh, "<", $filename) {
                # ここで $! は無意味。
                ...
    }
    else {
                # ここでだけ $! に意味がある。
                ...
                # ここで既に $! は無意味かもしれません。
    }
    # ここでは成功と失敗の両方の可能性があるので、
    # $! は無意味。

ここで、無意味 というのは $!open() 演算子の結果に 関係ないということです。 $! への代入も同様に一時的なものです。 これは、終了値を設定したり、エラー n に対応するシステムエラー文字列を 調べたり、$! を意味のある状態に復元するために、die() 演算子を 起動する直前で使えます。

記憶法: 何が bang(!) したか。

%OS_ERROR
%ERRNO
%!

%! の各要素は、$! がその値にセットされている場合にのみ真の値を持ちます。 例えば、$!{ENOENT} は、現在の $! の値が ENOENT の場合にのみ 真となります; これは、最近のエラーが "No such file or directory" (あるいは 倫理的に等価なもの: 全ての OS が正確に同じエラーを出すわけではないですし、 全ての言語で出るわけでもありません) の場合です。 特定の真の値は保証されませんが、以前は一般的には $! の数値でした。 あなたのシステムで特定のキーが意味があるかどうかを調べるには、 exists $!{the_key} を使ってください; 有効なキーのリストを得るには、 keys %! としてください。 さらなる情報に関しては Errno/$! を参照してください。

この変数は Perl 5.005 で追加されました。

$CHILD_ERROR
$?

最後に 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 を 参照してください。

記憶法: shksh と同様。

$EVAL_ERROR
$@

最後の eval() 操作子による Perl の構文エラーメッセージです。 $@ が空文字列であれば、最後の eval() が正常に 解析され、実行されたことになります (が、実行した演算子が、 通常の意味で失敗しているかもしれません)。

警告メッセージはこの変数に入りません。 しかし、"%SIG" に記述されている $SIG{__WARN__} にセットすることで 警告を処理するルーチンを設定できます。

記憶法: どこで ("at") 構文エラーが起ったか。

これらの変数は現在のインタプリタの状態に関する情報を提供します。

$COMPILING
$^C

-c スイッチに関連付けられた現在の値です。 主に -MO=... と共に用いられ、例えば AUTOLOAD を通常の遅延ロードでは なくコンパイル時に実行するといった、コンパイル時の振る舞いを 変えるために用います。 $^C = 1 に設定することは B::minus_c を呼び出すのと似ています。

この変数は Perl v5.6.0 で追加されました。

$DEBUGGING
$^D

デバッグフラグの現在の値を示します。 読み書き可能です。 コマンドラインによる等価な機能と同様に、数値とシンボル値が使えます (例: $^D = 10 または $^D = "st")。

記憶法: -D スイッチの値。

${^ENCODING}

廃止予定!!!

ソースコードを Unicode に変換するために使われる Encode オブジェクトへの オブジェクトリファレンス 。 この変数のおかげで、Perl スクリプトを UTF-8 で書く必要がありません。 デフォルトは undef です。

この変数を undef 以外に設定することは、設計と実装の基本的な欠陥により 廃止予定です。 これは将来の Perl バージョンで削除することが計画されています。 この目的は、非 ASCII Perl スクリプトを UTF-8 で書く必要をなくすためでした; これは UTF-8 エンコードされたテキストで動作するエディタが一般的になる前は 有用でしたが、それはずっと前です。 これは、想定してない他のモジュールの操作に影響を与えるような問題を引き起こし、 一般的には破壊的です。 これはセグメンテーションフォルトを引き起こすこともあります。

この機能のような何かが必要な場合は、encoding プラグマを使うべきです; これもまた廃止予定ですが、厄介な副作用はより少ないです。

あなたがここに来た理由が、誰かがこの変数を使うことであなたのコードが 意図せずに影響を受けたためなら、通常は次のようにして回避できます:

 local ${^ENCODING};

これを壊れてしまった関数の先頭付近に書きます。 これにより、この関数を含むスコープを実行する間この変数を未定義にします。

この変数は Perl 5.8.2 で追加されました。

${^GLOBAL_PHASE}

perl インタプリタの現在のフェーズ。

取り得る値は:

CONSTRUCT

PerlInterpreter*perl_construct で構築されます。 この変数はほとんど完全性のためと、基礎となっている C 変数 PL_phase 経由での使用のために存在しています。 実際にはインタプリタの構築が完了しない限り Perl コードを 実行することはできません。

START

これはコンパイル時にグローバルです。 これは基本的に、直接実行されたり、トップレベルプログラムの コンパイル時の間に間接的に実行される全ての BEGIN です。

BEGIN ブロックとの混乱を避けるために、このフェーズの名前は "BEGIN" では ありません; これらは単にトップレベルプログラムではなく、任意のコンパイル ユニットのコンパイル中に実行されます。 例えば eval "use SomeModule" のように、実行時に入った 新しいローカル化されたコンパイル時はグローバルなインタプリタフェーズではなく、 従って ${^GLOBAL_PHASE} に反映されません。

CHECK

CHECK ブロックの実行。

INIT

"CHECK" と似ていますが、CHECK ブロックではなく INIT ブロック。

RUN

メインの実行; つまり PL_main_root の実行。

END

END ブロックの実行。

DESTRUCT

グローバルなデストラクタ。

また、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 で追加されました。

$^H

警告: この変数は厳密に内部使用に限定されます。 その可用性、挙動、内容は告知なく変更される可能性があります。

この変数には 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 ハッシュは $^H と同じスコープを持ちます。 これはレキシカルスコープを持つプラグマを実装するのに便利です。 perlpragma を参照してください。 実行時にアクセスされると全てのエントリは文字列化されるので、 単純な値のみに対応します。 これは、例えばオブジェクトへのポインタはないということです。

%^H に追加するとき、他のハッシュのユーザーとの衝突を回避するために、 キーの使い方に関する慣習があります。 モジュールはモジュールの名前(主なパッケージの名前)と "/" 文字で始まる キーのみを使うべきです。 例えば、モジュール Foo::BarFoo::Bar/baz のようなキーを 使うべきです。

この変数は Perl v5.6.0 で追加されました。

${^OPEN}

PerlIO で使われる内部変数です。 文字列は \0 で分割された二つの部分からなり、前半は入力層を、 後半は出力層を示します。

この変数は Perl v5.8.0 で追加されました。

$PERLDB
$^P

デバッグ機能のための内部変数です。 それぞれのビットの意味は変わるかもしれませんが、 現在のところは以下の通りです:

0x01

サブルーチンの出入りをデバッグします。

0x02

行毎にデバッグします。 各行を実行する毎に DB::DB() サブルーチンを呼び出します。 さらに、(0x400 のように) ソースコードを保存します。

0x04

最適化を行いません。

0x08

将来の対話的な検査のためにより多くのデータを保存します。

0x10

サブルーチンが定義されたソース行に関する情報を保持します。

0x20

シングルステップ実行で開始します。

0x40

報告時にサブルーチン名でなくサブルーチンのアドレスを使います。

0x80

goto &subroutine も同様に報告します。

0x100

eval に対して、コンパイルされた位置を元にした「ファイル」名を提供します。

0x200

無名サブルーチンに対して、 コンパイルされた位置を基にした参考名を提供します。

0x400

ソースコードの行数を @{"_<$filename"} に保存します。

0x800

ソースを保存するときに、サブルーチンがない eval を含みます。

0x1000

ソースを保存するときに、コンパイルしていないソースを含みます。

一部のビットはコンパイル時にのみまたは実行時にのみ意味があります。 これは新しい機構であり、詳細は変更されるかもしれません。 perldebguts も参照してください。

${^TAINT}

汚染検査モードのオン・オフを反映します。 1 はオン(プログラムは -T 付きで実行されている)、0 はオフ、-1 は汚染 警告のみが有効になっている(つまり -t-TU)ことを意味します。

この変数は読み込み専用です。

この変数は Perl v5.8.0 で追加されました。

${^UNICODE}

Perl のいくつかの Unicode 設定を反映します。 設定できる値に関するさらなる情報については perlrun-C オプションを 参照してください。

この変数は Perl 起動時に設定され、その後は読み込み専用です。

この変数は Perl v5.8.2 で追加されました。

${^UTF8CACHE}

この変数は内部 UTF-8 オフセットキャッシュコードの状態を制御します。 1 はオン(デフォルト)、0 はオフ、-1 は全ての結果を線形走査と比較して、 矛盾があれば異常終了する、という形でキャッシュコードをデバッグします。

この変数は Perl v5.8.9 で追加されました。 これは予告なく変更されたり削除されたりするかもしれませんが、現在のところ 複数バイト UTF-8 エンコード文字の境界の再計算を避けるために使われます。

${^UTF8LOCALE}

この変数は、起動時に perl によって UTF-8 ロケールが検出されたかどうかを 示します。 この情報は(-CL コマンドラインスイッチで起動されることによって) 「utf8 性をロケールに合わせる」モードのときに perl によって使われます; これに関するさらなる情報は perlrun を参照してください。

この変数は Perl v5.8.8 で追加されました。

非推奨および削除された変数

非推奨となった変数は、perl のメンテナが最終的にこの変数を 削除するということを意図して通知されます。 その状態にも関わらず、まだ利用可能です。 非推奨となった変数を使うと警告が出ます。

変数が削除された後で変数を使うと、この変数が非対応となったことを 知らせるエラーが出ます。

エラーメッセージの詳細については perldiag を参照してください。

$#

$# は、表示番号をフォーマットするために使われていました。 非推奨化の後、このマジックは Perl v5.10.0 で取り除かれ、警告を 引き起こします: $# is no longer supported.

これは $#array のように最後のインデックスを得るために配列名の前に付ける 印ではありません。 これは今でも Perl で配列の最後のインデックスを得る方法です。 これら二つには互いに何の関係もありません。

Perl 5 で非推奨となりました。

Perl v5.10.0 で削除されました。

$*

$* は複数行マッチングを有効にするために使われていた変数です。 非推奨化の後、このマジックは Perl v5.10.0 で削除されました。 これを使うと警告を引き起こします: $* is no longer supported。 代わりに /s/m の正規表現修飾子を使うべきです。

Perl 5 で非推奨となりました。

Perl v5.10.0 で削除されました。

$[

この変数は配列の最初の要素や、文字列の最初の文字のインデックスを 保管します。 デフォルトは 0 ですが、理論的には、index() 関数や substr() 関数を評価するときに、Perl の動作をより awk (や Fortran) に近づけるため、1 に設定することもできます。

Perl 5 からは $[ への代入は、コンパイラ指示子として扱われ、 他のファイルの動作に影響を与えることがなくなりました。 (これが、コンパイル時定数しか代入できない理由です。) この変数の使用は非推奨です。

Perl v5.10.0 より前では、$[ は(strict のような)その他のコンパイル時 指示子と異なり、同じファイルのレキシカルスコープの外側から見ることが 出来ていました。 これに local() を使うとこの値を厳密にレキシカルスコープの内側に限定します。 今では常にレキシカルスコープを持ちます。

Perl v5.16.0 から、これは arybase モジュールで実装されています。 この振る舞いに関するさらなる詳細については arybase を参照してください。

use v5.16 または no feature "array_base" の基では、$[ は もはや何の効果もなく、常に 0 が入っています。 これに 0 を代入することは許されますが、それ以外の値はエラーを引き起こします。

記憶法: [ は添え字付けの始め。

Perl v5.12.0 で非推奨となりました。