Perlの特殊変数
Perl
›
here
Perlの特殊変数の一覧です。特殊変数とは、Perlであらかじめ定義されているグローバル変数のことです。変数名によって、その用途が特定されています。これだけは必ず覚えておきたいという特殊変数から紹介します。
$_ - デフォルト変数
「$_」はデフォルト変数と呼ばれます。自分でデフォルト引数を利用することは、可読性のことを考えると控えたほうがよいですが、標準関数には、デフォルト変数を利用するものがあるので、いくつか覚えておく必要があります。
最低限、map関数、grep関数、後置のforで「$_」が使われることが多いので覚えておきましょう。
map関数
map { $_ => 1} @elements
grep関数
grep { $_ eq 'foo' } @elements
後置のfor
$_ for @elements;
%ENV - 環境変数の取得と設定
環境変数には%ENVという特殊変数でアクセスできます。
%ENV
環境変数名が、キーになっており $ENV{'env_name'} で値を参照できます。環境変数とは、OSが持つ変数のようなものです。環境変数は、OSがプロセスを起動したときに、プロセス空間のメモリ上にコピーされます。OSの環境変数は、プロセスからは、変更できません。
環境変数は、自由に設定変更できますが、そのプロセスでのみで有効です。あるプロセスが、子プロセスを起動したときは、OSが、プロセスを起動したときのように、環境変数がコピーされます。
$0 - プログラム名を取得する
プログラム名を取得するには特殊変数「$0」を使用します。
$0;
プログラムを起動したときの名前を取得します。つまり、絶対パスでプログラムを指定すれば、絶対パス名が、カレントディレクトリから、相対パスで指定した場合は、相対パス名で、プログラム名を取得できます。
@INC - モジュールの検索パスのリスト
モジュールの検索パスの一覧は@INCという特殊変数に代入されています。
@INC
モジュールの検索パスとは、Perlが、モジュールを読み込むために、検索するディレクトリのことです。@INC に、含まれないディレクトリに置かれたモジュールは、読み込むことができません。
libモジュールを使って、モジュールの検索パスを追加する
use lib './lib';
libモジュールを使うことで、コンパイル時に、@INC に、検索パスを追加できます。
@INC の先頭に直接、モジュールの検索パスを追加する
unshift @INC, './lib2';
unshift関数で、直接先頭に、追加します。このやり方より、use lib を用いるほうがよいです。use lib を使う利点は、コンパイル時に、検索パスが追加されることと、可読性が高まること、アーキテクチャに応じたパスも追加されることです。
%INC - 読み込まれているモジュールを調べる
読み込まれているモジュールを調べるには%INCという変数を見ます。
%INC
%INC ハッシュは、モジュール名とモジュールのファイル名の組み合わせが、代入されています。モジュール名と、実際にどのファイルをインポートしたのかがわかります。
モジュールの検索パスが格納されている、 @INC とは何の関係もありません。@INC と %INC はまったく別の変数です。モジュール名だけを知りたい場合は、keys関数で、キーだけを取り出してあげます。
$^O - OS名を取得する
OS名を取得するには$^Oという特殊変数を使用します。
$^O
$^O の値とOSの種類
各OSにおける「$^O」の値をまとめました。
$^Oの値 | 説明とリンク | |
MacOS | MacOS | |
MSWin32 | Windows 全般 | |
os2 | OS/2 | |
VMS | VMS | |
epoc | EPOC OS (たぶん) | |
NetWare | NetWare | |
symbian | Symbian OS | |
dos | MS-DOS | |
cygwin | cygwin | |
linux | Linux | |
freebsd | FreeBSD | |
solaris | Solaris | |
Unix ( 違うかも ) | Unix | |
darwin | Mac OS X | |
CentOS | Linux |
その他の特殊変数
$? - 子プロセスの終了ステータス
子プロセスの終了ステータスを取得するには「$?」を使用します。
$?
waitで子プロセスの終了を待った]場合は、$?に子プロセスの終了ステータスを含めた複数の値が格納されます。またsystem関数を使って子プロセスを実行した場合にも$?が設定されます。
すべての特殊変数の一覧
特殊変数の一覧を以下にまとめておきます。詳細については公式ドキュメント「perlvar」をご覧ください。
特殊変数 | 意味 |
---|---|
$_ | デフォルト引数 |
@_ | サブルーチンの引数 |
$" | 配列がダブルクォートで変数展開された場合のセパレーター |
$$ | プロセスID |
$0 | 実行されているプログラムの名前 |
$( | プロセスの実グループID |
$) | プロセスの実行グループID |
$ | プロセスの実ユーザーID |
$> | プロセスの実行ユーザーID |
$; | 多次元配列のエミュレーションのための添え字の区切り文字 |
$a, $b | sort関数で使う変数 |
%ENV | 環境変数 |
$^F | ファイル記述子の最大値 |
@F | 自動スプリットモードが有効の場合、それぞれの行のフィールドを含む |
@INC | ライブラリの読み込みパスのリスト |
%INC | インクルードされたファイルの名前の一覧 |
$^I | 置き換え編集の拡張子 |
$^M | メモリが足りなくなった場合にトラップするか |
$^O | オペレーティングシステムの名前 |
%SIG | シグナルハンドラ |
$^T | プログラムを開始した時刻 |
$^V | Perlのバージョン情報 |
$^X | 実行されたときの名前 |
$1, $2, $3 | 正規表現でキャプチャされた文字列 |
$& | 最後に成功したパターンマッチでマッチした文字列 |
$` | パターンマッチでマッチした文字列の前の部分 |
$' | パターンマッチでマッチした文字列の後の部分 |
$+ | 最後のパターンマッチの最後にキャプチャされた文字列 |
$^N | パターンマッチにおける最後に使われたグループ |
@+ | 最後に成功したマッチングの最後へのオフセット |
%+ | 最後に成功したマッチングで名前付きキャプチャの値 |
@- | 最後マッチした先頭のオフセット |
%- | 最後に成功したマッチングで名前付きキャプチャの値、値のリストが可能 |
$^R | 正規表現アサートの結果 |
${^RE_DEBUG_FLAGS} | 正規表現デバッグフラグ |
$ARGV | <>からの読み込んでいるときのファイル名 |
@ARGV | コマンドライン引数 |
ARGV | <ARGV>で@ARGVの中のファイル名に対するファイルハンドル |
ARGVOUT | -iを使ったときの現在開いているファイルハンドル |
$, | printのための出力フィールドの区切り文字 |
$. | ファイルハンドルの現在の行番号 |
$/ | 入力レコードセパレーター |
$\ | 出力レコードセパレーター |
$| | バッファリングしないようにする |
${^LAST_FH} | 最後に読み込んだファイルハンドルへのリファレンス |
$^A | フォーマットに関する特殊変数 |
$^L | フォーマットに関する特殊変数 |
$% | フォーマットに関する特殊変数 |
$- | フォーマットに関する特殊変数 |
$: | フォーマットに関する特殊変数 |
$= | フォーマットに関する特殊変数 |
$^ | フォーマットに関する特殊変数 |
$~ | フォーマットに関する特殊変数 |
${^CHILD_ERROR_NATIVE} | システムコールにおけるネイティブなステータス |
$^E | 現在のOSのエラー情報 |
$^S | 現在のインタープリタの状態 |
$^W | 警告 |
$! | システムコールのエラー |
%! | システムコールのエラーナンバーと内容 |
$? | 子プロセスのエラー |
$@ | evalで例外をキャッチした場合に、その内容が保存される |
$^C | コンパイルスイッチ |
$^D | デバッグフラグ |
${^ENCODING} | Perlのソースコードの文字コード |
${^GLOBAL_PHASE} | Perlインタープリタの現在のフェーズ |
$^H | コンパイル時ヒント |
%^H | $^Hと同じスコープを持つ |
${^OPEN} | PerlIOのための内部変数 |
$^P | デバッグのための内部変数 |
${^TAINT} | テイントモードかどうか |
${^UNICODE} | ユニコード設定 |
${^UTF8CACHE} | 内部UTF-8のオフセットキャッシュコードの状態 |
${^UTF8LOCALE} | UTF-8ロケールが検出されたかどうか |
特殊変数は、ソースコードの可読性を著しく下げるので、本当に必要になるまでは、使わないことをお勧めします。