perlrun - Perl インタプリタの起動方法
perl [ -gsTtuUWX ] [ -h?v ] [ -V[:configvar] ] [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ] [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ] [ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ] [ -C [number/list] ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...
Perl プログラムを実行する普通の方法は、直接実行できる形にするか、 コマンドラインの引数としてソースファイルの名前を渡すことです。 (対話的な Perl 環境もあります -- どのようにするかの詳細については perldebug を参照してください。) 実行にあたって、Perl は指定されたプログラムを以下に示す場所で 探します:
-
コマンドライン上で最初のファイル名として示されたファイルの中。 (
#!記法をサポートしているシステムでは、このようにして インタプリタを呼び出します。 "Location of Perl" を参照してください。) -
標準入力から暗黙に渡される。 ファイル名を示す引数が無い場合にのみうまくいきます--STDIN から読み込む プログラムに引数を渡すには、プログラム名として明示的に "-" を 指定しなくてはなりません、
2 番目、3 番目の方法では、"-x" スイッチを指定した場合を除いて、 Perl は入力ファイルを最初から解析し始めます; -x スイッチを指定した 場合には、まず、最初に #! と "perl" という文字列を含む行を探し、 そこから解析を始めます。 これは、大きなテキストにプログラムを埋め込んで、実行するようなときに便利です。 (この場合、プログラムの終わりは、トークン __END__ を使って 示すとよいでしょう。)
#! を含む行のスイッチが必ず解析されるようになりました。 つまり、#! の行で引数が一つしか許されない、あるいはもっと悪く、 #! の行が認識されないといったシステムで運用している場合にも、 "-x" でプログラムの開始位置を見つけた場合を含め、どのように Perl が 起動されたかによらず、一貫したスイッチの動作を期待できるようになっています。
歴史的なオペレーティングシステムの中にはカーネルによる #! 行の解釈が、 エラーなしに 32 文字で打ち切られてしまうものがありますので、あるスイッチは コマンドラインに渡され、あるスイッチは渡されないといったことが起こります; 注意しないと、文字が続かない "-" だけが渡されるといったことも 起こり得ます。 すべてのスイッチが、確実に 32 文字境界の前か後ろかのどちらかに なるようにしたいことでしょう。 多くのスイッチは、余分に処理されても問題ありませんが、完全なスイッチの 代わりに "-" が入っていた場合には、プログラムの代わりに、標準入力を Perl に 実行させることになってしまいます。 -I スイッチが中途半端になった場合にも おかしな結果となり得ます。
2 回実行されることに注意する必要のあるスイッチもあります; 例えば -l と -0 の組み合わせです。 (可能なら) 両方のスイッチが 32 文字境界の後ろにいくようにするか、 -0digits を BEGIN{ $/ = "\0digits"; } で置き換えてください。
#! スイッチの解析は、行内で "perl" が示された位置から始まります。 とりわけ "-*" と "- " という文字の並びは無視されますので、以下のように 書くと:
#!/bin/sh
#! -*- perl -*- -p
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;Perl に "-p" スイッチを渡すことができます。
似たようなトリックは(持っていれば) env プログラムでも使えます。
#!/usr/bin/env perl上の例は Perl インタプリタに相対パスを使って、 ユーザーの PATH で最初にあったバージョンを使います。 もし特定のバージョンの Perl、例えば perl5.14.1 が使いたいなら、 #! 行のパスに直接書くべきです。
#! 行に "perl" や "indir" という語が含まれていなければ、#! の後に 指定されたプログラムが Perl インタプリタの代わりに実行されます。 これは少し変わっていますが、#! が行なえないマシンを使っている方には 有効でしょう; プログラムに対して使っている SHELL が /usr/bin/perl だと 言っておけば、Perl が正しいインタプリタを起動してくれるからです。
プログラムの場所が特定できたなら、Perl はプログラム全体を内部形式に コンパイルし始めます。 コンパイルエラーが見つかった時には、プログラムの実行は行なわれません。 (これは、構文エラーがある場合にも、途中まで実行される可能性のある、 典型的なシェルのスクリプトと異なる点です。)
プログラムが構文的に正しければ、実行されることになります。 プログラムが、exit() 演算子にも die() 演算子にも当たらないで最後まで 到達すると、正常に完了したことを示すために、暗黙の exit(0) が 行なわれます。
(非 Unix システムでの #! とクォート)
Unix の #! のテクニックは他のシステムでもシミュレートされています。
- OS/2
-
以下のように
extproc perl -S -your_switches*.cmdファイルの最初の行に書いてください ("-S" は cmd.exe の `extproc' の扱いのバグを引き起こします)。 - MS-DOS
-
プログラムを実行するバッチファイルを作って、
ALTERNATE_SHEBANGで コード化してください (さらなる情報についてはソース配布パッケージの dosish.h ファイルを参照してください)。 - Win95/NT
-
Win95/NT でのインストールにおいて、ActiveState の Perl 用インストーラを 使った場合は、拡張子 .pl を Perl インタプリタに関連付けるよう レジストリを変更します。 他の方法で Perl をインストールした場合(ソースから構築した場合を含みます)、 レジストリを自分で変更する必要があります。 これは実行可能な Perl プログラムと Perl ライブラリファイルとの 違いがなくなってしまうことに注意してください。
- VMS
-
以下のように
$ perl -mysw 'f$env("procedure")' 'p1' 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8' ! $ exit++ + ++$status != 0 and $exit = $status = undef;プログラムの先頭に書いてください; ここで -mysw は Perl に渡したい コマンドラインスイッチです。 これで
perl programとして直接プログラムを起動できますし、@programとして(あるいは DCL$PATH 経由でプログラム名を使って) DSL 手続きとして起動できます。この決まり文句は覚えるには少々長すぎますが、
perl "-V:startperl"とすれば Perl がこれを表示してくれます。
非 Unix システムのコマンドインタプリタはクォートに関して Unix シェルと 異なった考え方をしています。 お使いのコマンドインタプリタの特殊文字について (*, \, " は 一般的です)、そして一行で起動するために(後述する -e を 参照してください)空白や特殊文字を保護する方法について学ぶ必要があるでしょう。
システムによってはシングルクォートをダブルクォートに変更する必要が あるかもしれません; しかし Unix や Plan9 のシステムでは してはいけません。 また、単体の % を %% に変更する必要があるかもしれません。
例えば:
# Unix
perl -e 'print "Hello world\n"'
# MS-DOS, etc.
perl -e "print \"Hello world\n\""
# VMS
perl -e "print ""Hello world\n"""問題は、これらはどれも信頼性がないことです: これはコマンドに依存し、どれも 動かないかもしれません。 4DOS がコマンドシェルなら、おそらくよりよく動きます:
perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""Windows NT の CMD.EXE は誰も見ていない間に多くの標準 Unix 機能が 入り込んでいますが、クォートのルールに関しては ドキュメントを探してみてください。
この辺りのことに関する一般的な解決方法はありません。 まったくぐちゃぐちゃです。
(Perl の位置)
当たり前のように聞こえるかもしれませんが、 Perl はユーザーが簡単に発見できる場合にのみ有用です。 可能なら、/usr/bin/perl と /usr/local/bin/perl の両方に 実際のバイナリへのシンボリックリンクを置くというのはよい考えです。 もしこれが無理なら、システム管理者は Perl と付随するユーティリティ (への シンボリックリンク) を、典型的にユーザーの PATH で見付かるディレクトリか、 その他の明らかで便利な場所に置くべきです。
このドキュメントでは、#!/usr/bin/perl とプログラムの先頭に書けば システムの全てのメソッドが実行できるものとしています。 特定のバージョンを使いたい場合は、特定のパスを使うか:
#!/usr/local/bin/perl5.14あるいは単に最低限のバージョンを指定した場合は、 以下のような行をプログラムの先頭に置いてください:
use v5.14;(コマンドスイッチ)
全ての標準コマンドと同様に、1 文字のスイッチは、次に続くスイッチが あれば、それとつなげることができます。
#!/usr/bin/perl -spi.orig # same as -s -p -i.orig-- はオプションの末尾を示してさらなるオプション処理を無効にします。 -- の後ろの引数は全てファイル名と引数として扱われます。
スイッチ一覧:
- -0[octal/hexadecimal]
-
入力レコードセパレータ (
$/) を 8 進数または 16 進数で示します。 digits を指定しないと、ヌル文字がセパレータになります。 他のスイッチを前に置いてもかまいませんし、digits のあとに つなげてもかまいません。 たとえば、ファイル名をヌル文字で区切って表示できる find があれば:find . -name '*.orig' -print0 | perl -n0e unlink00 という特別な値は、Perl にパラグラフモードで、ファイルを読ませます。
0400 以上の任意の値は、Perl にファイル全体を読ませることになりますが、 規約により、普通はこの目的のために値 0777 を使います。 "-g" フラグはこれのより簡単な別名です。
16 進数の記法 -0xHHH... を使ってセパレータ文字を指定することもできます; ここで
Hは 16 進数として有効な文字です。 8 進数形式と違って、これは 0xFF を超えたものを含む任意の Unicode 文字を 指定するために使われるかもしれません。 それで、本当に 0777 のレコード区切りを使いたいなら、-0x1FF として 指定してください。 (これは "-x" オプションで 16 進数の数値からなるディレクトリ名を指定できない ことを意味します; さもなければ Perl は指定された 16 進数を -0 と 扱います。) - -a
-
"-n" や "-p" といっしょに用いると、自動 split モードになります。 "-n" や "-p" で作られる暗黙のループ内の最初の文として、 配列 @F への暗黙の split コマンドが実行されます。
perl -ane 'print pop(@F), "\n";'は以下のものと等価です。
while (<>) { @F = split(' '); print pop(@F), "\n"; }-F を使って区切文字を変更することができます。
-a は暗黙に "-n" を設定します。
- -C [number/list]
-
-Cフラグは Perl Unicode 機能のいくつかを制御します。
5.8.1 から、-C フラグは数値またはオプション文字のリストを つけることが出来ます。 指定可能な文字と数値およびその効果は以下の通りです; 文字のリストは数値の合計と同じです。
I 1 STDIN は UTF-8 と仮定する O 2 STDOUT は UTF-8 と仮定する E 4 STDERR は UTF-8 と仮定する S 7 I + O + E i 8 UTF-8 は入力ストリームのデフォルト PerlIO 層 o 16 UTF-8 は出力ストリームのデフォルト PerlIO 層 D 24 i + o A 32 @ARGV の要素は UTF-8 でエンコードされた文字列と推測する L 64 通常は "IOEioA" は無条件ですが、 L はロケール環境変数(LC_ALL, LC_CTYPE, LANG, 優先度順)によって 条件付きとなります -- もし変数が UTF-8 を示していれば、 選択された "IOEioA" が有効になります a 256 デバッグモードで UTF-8 キャッシュコードを実行するために、 ${^UTF8CACHE} を -1 にセットする。例えば、-COE と -C6 はどちらも STDOUT と STDERR を UTF-8 化します。 同じ文字を繰り返しても冗長なだけで、加算されたりトグルになったりはしません。
ioオプションは main プログラムスコープで引き続く open() (あるいは同様の I/O 操作) において暗黙的に:utf8PerlIO 層が適用されます; 言い換えると、 入力ストリームでは UTF-8 が想定され、出力ストリームはUTF-8 で出力されます。 これは単に${^OPEN}で設定されたデフォルトであり、 通常どおり open() と binmode() で明示的に変更できます。 これはモジュールの中で実行されるコードには無効です。-C が単体で(数値やオプションリストなし)起動されるか、 "PERL_UNICODE" 環境変数が空文字列
""の場合、-CSDL と 同じ効果となります。 言い換えると、標準 I/O 操作とデフォルトのopen()層はロケール環境変数が UTF-8 ロケールを示している場合 のみ UTF-8 化されます。 この振る舞いは Perl 5.8.0 での 暗黙の (そして問題のある) UTF-8 に 関する振る舞いと同じです。 ("UTF-8 no longer default under UTF-8 locales" in perl581delta を 参照してください。)-C0 (あるいは
PERL_UNICODEに"0") を指定すると 明示的に上記の全ての Unicode 機能を無効にします。読み込み専用のマジック変数
${^UNICODE}にこの設定の数値表現が 反映されます。 これは Perl 起動時にセットされる変数で、読み込み専用です。 実行中に効果を得たい場合は、3 引数の open() ("open" in perlfunc 参照), 2 引数の binmode() ("binmode" in perlfunc 参照),openプラグマ (open 参照) を使ってください。(5.8.1 以前の Perl では -C スイッチは Win32 専用のスイッチで、 Unicode 対応の "ワイド文字システムコール" Win32 API を使うためのものでした。 この機能は事実上使われませんでしたが、コマンドラインスイッチは "再利用" されました。)
注意: perl 5.10.1 から、-C スイッチが
#!行で使われると、 コマンドラインでも指定しなければなりません; なぜなら標準ストリームは perl インタプリタ実行のこの地点で既に設定されているからです。 I/O ストリームのエンコーディングの設定に binmode() も使えます。 - -c
-
Perl にスクリプトの構文のチェックを行なわせ、実行せずに 終了するようにします。 実際には、
BEGIN,UNITCHECK,CHECKブロックとuse文は 実行します: これらはプログラムの実行の外側にあるものと 考えられます。INITとENDブロックはスキップされます。構文チェックが成功すると、終了コード 0 で終了し、
yourprogram syntax OKと返します。 失敗時は、perl は検出したエラーを表示し、非 0 終了コードで終了します。 - -d
- -dt
-
Perl デバッガの下でプログラムを実行します。 perldebug を参照してください。 t が指定されると、デバッグするコードがスレッドを使っていることを デバッガに示すために環境変数
PERL5DB_THREADED=1が設定されます。 - -d:MOD[=bar,baz]
- -dt:MOD[=bar,baz]
-
Devel::MODとしてインストールされる デバッグ、プロファイリング、 トレースモジュールの制御下でプログラムを実行します。 つまり、-d:DProf はDevel::DProfプロファイラを使って プログラムを実行します。 -M フラグと共に使うと、オプションはDevel::MODパッケージに渡され、Devel::MOD::importルーチンで 解釈されます。 再び、-M と同様、インポートではなくDevel::MOD::unimportを 呼び出すには --d:-MOD を使ってください。 オプションをコンマ区切りのリストにするときは=の文字の後に 続けなければなりません。 t が指定されると、デバッグするコードがスレッドを使っていることを デバッガに示します。 perldebug を参照してください。 - -Dletters
- -Dnumber
-
デバッグフラグを設定します。 このオプションは、perl バイナリがデバッグを有効にしてビルドされている 場合にのみ有効になります: 通常の製品版 perl は有効になりません。
例えば、スクリプトがどのように実行されるかを見るには、-Dtls を 使ってください。 この他に役に立つ値としては、コンパイルされた構文ツリーを表示する、 -Dx があげられます; -Dr は、コンパイルした正規表現を表示します; 出力形式については perldebguts に説明があります。
文字のリストの代わりに数字を指定することもできます (たとえば、-D14 は -Dtls と等価です):
1 p トークン化と構文解析 (v と併用されると、パーススタックの表示) 2 s スタックの表示 (v と併用されると、全てのスタックの表示) 4 l コンテキスト(ループ)スタックの処理 8 t 実行のトレース 16 o メソッドとオーバーロードの解決 32 c 文字列/数値変換 64 P プロファイリング情報、ソースファイル入力状態の表示 128 m メモリと SV の配置 256 f フォーマットの処理 512 r 正規表現の解析と実効 1024 x 構文トリーのダンプ 2048 u 汚染チェック 4096 U 非公式な、ユーザーハック (プライベートな、リリースされない 利用法のために予約) 8192 h ハッシュランダム化のデバッグ出力を表示 (PL_hash_rand_bits と その元の変更) 16384 X スクラッチパッドの配置 32768 D 全消去 65536 S op スラブアロケーション 131072 T トークン化 262144 R ダンプされた変数のリファレンスカウントを含む(-Dsのとき) 524288 J DB パッケージの中での s,t,P デバッグコードを表示(飛び越えない) 1048576 v 詳細: 他のフラグと組み合わせて出力の詳細度を上げる。 その他の多くのフラグでは何もしない 2097152 C コピーオンライト 4194304 A 内部構造の一貫性チェック 8388608 q 静粛 - 現在のところ "EXECUTING" メッセージだけを抑制する 16777216 M スマートマッチングの解決をトレース 33554432 B BEGIN のような特殊ブロックを含む、suBroutine 定義のダンプ 67108864 L ロケール関連の情報をトレース; 出力内容は変更される可能性が高い 134217728 i PerlIO 層処理のトレース。PERLIO_DEBUG に トレースするファイル名を設定すること。 268435456 y y///, tr/// のコンパイルと実行をトレースこれらの全てのフラグは Perl 実行ファイルをコンパイルするときに -DDEBUGGING が指定されている必要があります (但しこれを変更するかもしれない Devel::Peek の
:opdや "'debug' mode" in re を参照してください)。 そうするためにどうすればいいかについては Perl のソース配布パッケージの INSTALL ファイルを参照してください。シェルスクリプトにおける
sh -xのように、単に今実行している Perl の コードを表示したい場合は、Perl の -D スイッチは使えません。 代わりに以下のようにしてください:# If you have "env" utility env PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program # Bourne shell syntax $ PERLDB_OPTS="NonStop=1 AutoTrace=1 frame=2" perl -dS program # csh syntax % (setenv PERLDB_OPTS "NonStop=1 AutoTrace=1 frame=2"; perl -dS program)詳細とバリエーションについては perldebug を参照してください。
- -e commandline
-
1 行のプログラムを指定するのに使用します。 -e が指定されると Perl は引数のリストからはファイル名を探しません。 複数の -e コマンドで、複数行のスクリプトを構成することができます。 通常のプログラムでセミコロンを置くところには、セミコロンを使うことに 気を付けてください。
- -E commandline
-
-e と同様に振る舞いますが、暗黙に全てのオプション機能と 組み込み関数を(main コンパイル単位で)有効にします。 feature と builtin を参照してください。
- -f
-
起動時の $Config{sitelib}/sitecustomize.pl の実行を無効化します。
Perl は実行時に (BEGIN ブロックの中で) デフォルトで $Config{sitelib}/sitecustomize.pl を実行しようとさせるように ビルドできます。 これはシステム管理者が、Perl がどのように振る舞うかをカスタマイズするための フックです。 例えば、Perl が非標準の位置にあるモジュールを見つけられるように @INC 配列に エントリを追加するために使えます。
Perl は実際には以下のコードを挿入します:
BEGIN { do { local $!; -f "$Config{sitelib}/sitecustomize.pl"; } && do "$Config{sitelib}/sitecustomize.pl"; }実際には (
requireではなく)doなので、sitecustomize.pl は 真の値を返す必要はありません。 このコードはmainパッケージで、独自のレキシカルスコープで動作します。 しかし、スクリプトが die すると、$@は設定されません。$Config{sitelib}の値は C コードで決定され、Config.pmは 読み込まれないので、ここの値は使われません。コードは とても 早くに実行されます。 例えば、
@INCへの変更は `perl -V` の出力に表示されます。 もちろん、ENDブロックは同様にとても遅くに実行されます。この機能がコンパイルされているかどうかを実行時に決定するために、
$Config{usesitecustomize}の値をチェックできます。 - -Fpattern
-
"-a" のための、split を行なう正規表現を指定します。 パターンは
//,"",''で囲むか、シングルクォートの中に書きます。 パターン中にリテラルな空白や NUL 文字は使えません。 - -g
-
入力レコード区切り文字 (
$/) を未定義化して、 吸い込みモードを有効にします。 言い換えると、Perl は行単位ではなくファイル全体を一度に 読み込むようになります。このフラグは -0777 のより簡単な別名です。
記憶法: gobble, grab, gulp.
- -h
-
オプションの一覧を表示します。
- -?
-
-h の同義語: オプションの一覧を表示します。
- -i[extension]
-
<>の構文で処理されたファイルを置き換えるための拡張子を 指定します。 これは、入力ファイルをリネームし、元の名前で出力ファイルを open し、 print() 文のデフォルトとしてその出力ファイルを select することで行ないます。 extension が指定されると、昔の内容のバックアップを行なう ファイル名の拡張子として、元のファイル名に付け加えられます。extension が指定されず、システムが対応しているなら、元の file は名前なしで 開いたままになる一方、出力は元の filename の新しいファイルに リダイレクトされます。 クリーンかどうかに関わらず、perl が終了した時点で、元の file は アンリンクされます。
extension に
*が含まれていない場合、現在のファイル名の末尾に 接尾子として付け加えられます。 extension に一つ以上の*の文字がある場合、 それぞれの*は現在のファイル名で置き換えられます。 Perl 的に書くと、以下のようになります:($backup = $extension) =~ s/\*/$file_name/g;以下のようにすると、(接尾子の代わりに、あるいは接尾子に加えて) バックアップファイルに接頭子をつけることができます。
$ perl -pi'orig_*' -e 's/bar/baz/' fileA # backup to # 'orig_fileA'元のファイルのバックアップコピーを(既にある)他のディレクトリに作ることも できます:
$ perl -pi'old/*.orig' -e 's/bar/baz/' fileA # backup to # 'old/fileA.orig'以下の一行スクリプトは全て等価です:
$ perl -pi -e 's/bar/baz/' fileA # overwrite current file $ perl -pi'*' -e 's/bar/baz/' fileA # overwrite current file $ perl -pi'.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig' $ perl -pi'*.orig' -e 's/bar/baz/' fileA # backup to 'fileA.orig'シェルから以下のように起動すると:
$ perl -p -i.orig -e "s/foo/bar/; ... "プログラムで以下のようにするのと同じで:
#!/usr/bin/perl -pi.orig s/foo/bar/;以下とほぼ等価です:
#!/usr/bin/perl $extension = '.orig'; LINE: while (<>) { if ($ARGV ne $oldargv) { if ($extension !~ /\*/) { $backup = $ARGV . $extension; } else { ($backup = $extension) =~ s/\*/$ARGV/g; } rename($ARGV, $backup); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # this prints to original filename } select(STDOUT);違うのは、-i の形式が、いつファイル名が変わったかを知るために、 $ARGV と $oldargv を比較する必要がないことです。 しかしながら、選択するファイルハンドルとして ARGVOUT は使用します。 ループのあとは、STDOUT がデフォルトのファイルハンドルとして再設定されます。
上述の通り、Perl はバックアップファイルを実際に出力が変更されたかどうかに 関わらず作成します。 従って、以下はファイルをコピーする変わった方法となります:
$ perl -p -i'/some/file/path/*' -e 1 file1 file2 file3... or $ perl -p -i'.orig' -e 1 file1 file2 file3...個々のファイルの終わりに何かを付け加えたいときや、行番号を リセットしたいような場合に、個々の入力ファイルの終わりを知るために、 括弧の無い
eofを使うことができます ("eof" in perlfunc の例を 参照してください)。与えられたファイルに対して、Perl が指定された拡張子でバックアップファイルを 作れない場合、そのファイルはスキップされて(もしあれば)次のファイルに 移って継続します。
ファイルのパーミッションと -i に関する議論については、 "Why does Perl let me delete read-only files? Why does -i clobber protected files? Isn't this a bug in Perl?" in perlfaq5 を 参照してください。
-i は、ディレクトリを作ったり、ファイルの拡張子を取り除いたりは できません。
Perl は
~を展開しません; これはバックアップファイルを以下のようにして 作る人々のためにはよいことです。$ perl -pi~ -e 's/foo/bar/' file1 file2 file3...-i は同じ名前で新しいファイルを作る前に元のファイルをリネームまたは 削除するので、Unix 形式のソフトリンクやハードリンクは保存されないことに 注意してください。
最後に、-i スイッチは、コマンドラインでファイルが指定されなくても 実行を妨げません。 この場合、バックアップファイルは作成されず(もちろん、元のファイルが 決定できません)、予想通り、STDIN から STDOUT に処理が行われます。
- -Idirectory
-
-I で指定されたディレクトリはモジュールの検索パス(
@INC)に 加えられます。 - -l[octnum]
-
自動の行末処理を行なうようにします。 これには、2 つの独立した機能があります。 1 つには、"-n" や "-p" を使ったときに、自動的に
$/(入力レコード セパレータ)を chomp します。 2 つめに octnum を$\(出力レコードセパレータ) に代入し、print 文で セパレータを追加できるようにします。 octnum を指定しなかった場合には、その時点の$/の値を$\に 設定します。 たとえば、行を 80 カラムに切り詰めるには以下のようにします:perl -lpe 'substr($_, 80) = ""'$\ = $/という代入は、-l スイッチが処理されるときに 実行されるときに行なわれますので、-l スイッチの後に -0 スイッチを置くようにすれば、 入力レコードセパレータを、 出力レコードセパレータと違うようにもできます:gnufind / -print0 | perl -ln0e 'print "found $_" if -p'これはまず、
$\に改行 ($/のデフォルト値) を設定し、 それから$/にヌル文字を設定します。 - -m[-]module
- -M[-]module
- -M[-]'module ...'
- -[mM][-]module=arg[,arg]...
-
-mmodule はプログラムの実行前に
use module ();を 実行します。 これはモジュールを読み込みますが、そのimportメソッドは呼び出さないので、 サブルーチンをインポートすることはできず、プラグマの効果もありません。-Mmodule はプログラムの実行前に
use module;を実行します。 これはモジュールを読み込んで、そのimportメソッドを呼び出すので、 モジュールの (典型的にはサブルーチンのインポートやプラグマの降下のような) デフォルトの効果が引き起こされます。 モジュール名の後ろに追加のコードを加えるためにクォートを使うこともできます; つまり'-MMODULE qw(foo bar)'などです。-M または -m の後の最初の文字がダッシュ(-)の場合、 'use' の代わりに 'no' が使われます。 これは -m で違いはありません。
Perl バージョン 5.39.8 から、
-Mオプションとモジュール名を 別のコマンドライン引数として渡すことができます:perl -M MODULE ... # like perl -MMODULE ... perl -M MODULE=arg1,arg2,... # like perl -MMODULE=arg1,arg2,...小さい組み込みのシンタックスシュガーとして、 '-MMODULE qw(foo bar)' の 代わりに -mMODULE=foo,bar または -MMODULE=foo,bar と 書くことができます。 これで、インポートするシンボルにクォートを使わなくてもよいようになります。 -MMODULE=foo,bar で生成される実際のコードは
use module split(/,/,q{foo,bar})です。=の形は -m と -M の間の違いを取り除くことに注意してください; これは、-mMODULE=foo,bar は -MMODULE=foo,bar と 同じということです。split操作の結果、例えば MODULE が Exporter を継承していたりして、MODULE::import()自身がバージョンチェックを行うように設定されていない限り -MMODULE=number は決してバージョンチェックは行いません。 - -n
-
以下のようなループが、実際のプログラムの回りにあるかのように Perl に 指示します; sed -n や awk のようにファイル名引数上で繰り返しを 行なうことになります:
LINE: while (<>) { ... # your program goes here }デフォルトでは、各行が印字されることはありません。 各行の印字を行なうには "-p" を参照してください。 引数で指定されたファイルがなんらかの理由でオープンできなかった場合、 Perl は警告を出して次のファイルに移ります。
また、
<>はコマンドライン引数を "open" in perlfunc に渡し、これは ファイル名として解釈する必要はないことに注意してください。 可能性のあるセキュリティの影響については perlop を参照してください。以下にあげるのは、少なくとも 1 週間以上更新されていないファイルを効率的に 削除するものです:
find . -mtime +7 -print | perl -nle unlinkこれは、ファイル名が見つかるごとにプロセスを起動しなくて済みますので、 find の -exec スイッチを使うよりも速くなります (しかし、より新しい find で利用可能な -delete オプションを使うより 速くはないです)。 これはパス名に改行コードがあるとうまく扱えないバグの影響を受けますので、 -0 の例に従うことで修正できます。
awk と同じように、暗黙に実行されるプログラムループの前後に実行される コードを指定するために、
BEGINブロックとENDブロックを 使うことができます。 - -p
-
以下のようなループが、実際のプログラムの回りにあるかのように Perl に 指示します; sed のようにファイル名引数上で繰り返しを行なうことに なります:
LINE: while (<>) { ... # your program goes here } continue { print or die "-p destination: $!\n"; }引数で指定されたファイルが何らかの理由でオープンできない場合、 Perl は警告を出し、次のファイルに移ります。 各行は、自動的に印字されることになります。 印字中のエラーは致命的とみなされます。 印字を抑制するには、"-n" スイッチを使ってください。 -p は -n スイッチを無効にします。
awk と同じように、暗黙に実行されるループの前後に実行されるコードを 指定するために、
BEGINブロックとENDブロックを使うことができます。 - -s
-
コマンドライン上のプログラム名の後から、ファイル名引数 (または引数 --) の前までのスイッチのための、原始的な解析を 行なえるようにします。 ここで見つかったスイッチは、@ARGV から取り除かれ、対応する Perl プログラムの main パッケージの変数に設定されます。 以下のプログラムは、-xyz というスイッチを付けて実行された時にだけ、 "1" と表示し、-xyz=abc と起動された時に "abc" と表示します。
#!/usr/bin/perl -s if ($xyz) { print "$xyz\n" }--help のようなスイッチは変数
${-help}を作成するので、use strict "refs"を満たさないことに注意してください。 また、警告を有効にしたスクリプトでこのオプションを使うと、大量の "used only once" という偽警告がでることになります。 これらの理由により、-s の仕様は非推奨です。 はるかに柔軟なオプションのパース方法については Getopt::Long を 参照してください。 - -S
-
プログラム名にパスセパレータを含まないとき、 Perl がプログラムを探すときに環境変数 "PATH" を参照するようにします。
プラットフォームによっては、Perl はファイルを探すときに拡張子を 追加します。 例えば Win32 プラットフォームでは、元々のファイル名で検索が失敗した場合、 ".bat" と ".cmd" の拡張子が追加されます; 但し既にそのような拡張子が ついていない場合だけです。 Perl が
DEBUGGINGを有効にしてコンパイルされていた場合、 -Dp スイッチを 使うことでどのように検索が行われているかを表示させることができます。これは、
#!をサポートしていないプラットフォームで、#!による実行を エミュレートするために使います。 また、#!を使ったスクリプトで、通常はシェルの $PATH 検索メカニズムで 見つけられるようなスクリプトをデバッグするのにも便利です。この例は Bourne shell 互換のシェルを持つ多くのプラットフォームで動きます:
#!/usr/bin/perl eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}' if 0; # ^ Run only under a shellシステムは、最初の行を無視し、プログラムを /bin/sh に渡し、 /bin/sh は Perl プログラムをシェルプログラムとして実行しようとします。 シェルは 2 行目を通常のシェルコマンドとして実行し、Perl インタプリタを 起動することになります。 $0 にフルパス名が入っているとは限らないシステムもありますので、 "-S" が Perl に必要に応じてプログラムを探すように指示します。 Perl がプログラムを見つけると、これらの行の解析を始めますが、 'if 0' が真になることがないため、無視することになります。 プログラムが csh で解釈される場合には、たとえファイル名内に埋め込まれた スペースなどを扱うことができなくても
${1+"$@"}を$*で 置き換える必要があるかもしれません。 csh ではなく、sh を起動するように、いくつかのシステムでは、#!の行を Perl も無視することになっている、コロンだけの行で置き換える必要が あるかもしれません。 そういった制御が効かないシステムでは、csh でも sh でも Perl でも使える、回りくどい方法を使うことが必要です:eval '(exit $?0)' && eval 'exec perl -wS $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -wS $0 $argv:q' if 0; # ^ Run only under a shellファイル名にディレクトリセパレータが含まれていた場合 (そしてそれが絶対パスまたは相対パスだった場合)、そしてそのファイルが なかった場合、ファイル拡張子を追加するプラットフォームでは ひとつずつ拡張子を追加して、ファイルを探します。
DOS 風のプラットフォームでは、プログラムにディレクトリセパレータが 含まれていなかった場合、PATH を探す前に最初にカレントディレクトリを 探します。 Unix プラットフォームでは、プログラムは厳密に PATH からのみ探されます。
- -t
-
"-T" と同様ですが、汚染チェックは致命的エラーではなく警告を発生させます。 この警告は通常通り
no warnings qw(taint)で制御できます。注意: これは
-Tの代用品ではありません! これは昔のコードを安全にするのを助けるために一時的に使用されるため だけの ものです: 本当の製品版コードと最初から書く安全なコードのためには常に本当の "-T" を使ってください。これは perl 汚染チェック対応なしでビルドされている場合は 何の効果もありません。
- -T
-
「汚染」チェックをオンにして、テストできるようにします。 通常、このチェックは setuid や setgid のスクリプトを実行するときにだけ、 行なわれます。 CGI プログラムやインターネットサーバーを Perl で書くときのように、 信用できるとは限らない人が動かすようなプログラムではこれを明示的に 有効にするのはいい考えです。 詳細については perlsec を参照してください。 セキュリティ上の理由から、このオプションは Perl にかなり早く 渡さなければなりません; これは通常コマンドラインの最初の方につけるか、
#!構造に対応するシステムではここに書くかです。 - -u
-
このスイッチはプログラムのコンパイル後、コアダンプを 行なうようにします。 理論的には、このコアダンプを持ってきて(Perl の配布では提供されていませんが) undump プログラムを使って、実行ファイルに変換することができます。 これは多少ディスク容量を食いますが (実行ファイルを strip することで 少しは減ります)、実行開始を速くすることができます。 (減らしても、"hello world" の実行ファイルは、私のマシンで 200K 程に なります。) ダンプする前に部分的にプログラムを実行しておきたい場合には、 このスイッチの代わりに
CORE::dump()関数を使ってください。 注意: undump が実行できるのは特定の環境下ですし、 これが使えない移植バージョンの Perl もあるでしょう。 - -U
-
Perl に安全でない操作を許可します。 現在のところ唯一の「安全でない」操作はスーパーユーザとして実行されている ときにディレクトリを削除しようとすることと、致命的な汚染チェックを 警告に変更して setuid プログラムを実行することです。 このオプションは実際に汚染チェック警告が 生成される ときに 有効でなければならないことに注意してください。
- -v
-
Perl 実行ファイルのバージョンとパッチレベルを表示します。
- -V
-
Perl の主な設定値と @INC の現在の値を表示します。
- -V:configvar
-
指定された設定変数の値を STDOUT に表示します;
configvar引数が正規表現のように見えるもの(英字以外を含んでいる)の 場合は複数表示します。 例えば:$ perl -V:libc libc='/lib/libc-2.2.4.so'; $ perl -V:lib. libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'; libc='/lib/libc-2.2.4.so'; $ perl -V:lib.* libpth='/usr/local/lib /lib /usr/lib'; libs='-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc'; lib_ext='.a'; libc='/lib/libc-2.2.4.so'; libperl='libperl.a'; ....さらに、追加のコロンはフォーマットの制御に使います。 末尾のコロンは改行と終端子 ";" を抑制し、シェルコマンド中にクエリを 組み込めるようにします。 (記憶法: PATH セパレータ ":"。)
$ echo "compression-vars: " `perl -V:z.*: ` " are here !" compression-vars: zcat='' zip='zip' are here !先頭のコロンはレスポンスの "name=" の部分を削除し、必要な名前に マッピングできるようにします。 (記憶法: 空ラベル)
$ echo "goodvfork="`./perl -Ilib -V::usevfork` goodvfork=false;もし位置パラメータの値を名前なしで必要なら、先頭のコロンと末尾のコロンを 両方使えます。 以下の場合、
PERL_APIパラメータはアルファベット順に返されることに 注意してください。$ echo building_on `perl -V::osname: -V::PERL_API_.*:` now building_on 'linux' '5' '1' '9' now - -w
-
1 度しか使われない変数名、設定される前に使われている変数、サブルーチンの 再定義、未定義のファイルハンドルの参照や、読み込み専用でオープンした ファイルハンドルへの書き込み、数値に 見えない 値を数値として使った場合、 配列をスカラであるかのように使った場合、100 段階以上のサブルーティンの再帰、 その他たくさんの疑わしい事に警告を出します。
このスイッチは実際にはグローバルな
$^W変数を有効にするだけです; 普通は、レキシカルスコープのuse warningsプラグマが推奨されます。__WARN__フックを使って特定の警告を無効にしたり致命的エラーにしたり できます; これについては perlvar と "warn" in perlfunc を参照してください。 perldiag と perltrap も参照してください。 もし警告のクラス全体を操作したいなら、粒度の細かい警告機能もあります; warnings を参照してください。 - -W
-
no warningsや$^Wの設定に関わらず全ての警告を有効にします。 warnings を参照してください。 - -X
-
use warningsや$^Wの設定に関わらず全ての警告を無効にします。 warnings を参照してください。"PERL5OPT"では禁止されています。 - -x
- -xdirectory
-
メールのような大きな無関係のテキストのかたまりの中にプログラムが 埋め込まれている事を Perl に伝えます。 最初の
#!で始まり、"perl" という文字列を含む行までの、先行するゴミは 捨てられます。 その行にある意味を持つスイッチは適用されます。プログラムによる行番号への全ての参照 (警告、エラー…) は
#!行を 最初の行として扱います。 従って、プログラムの 2 番目の行 (ファイルとしては 100 行目) での警告は 100 行目ではなく 2 行目として報告されます。 これは#line指示子を使って上書きできます。 ("Plain Old Comments (Not!)" in perlsyn を参照してください)ディレクトリ名が指定されると、Perl はプログラムの実行前にそのディレクトリに 変更します。 -x オプションは前に付いているごみを捨てることのみを制御します。 もし後ろに無視する必要のあるごみが付いているなら、プログラムは
__END__で 終了していなければなりません; もし望むなら、DATAファイルハンドル経由で 後ろに付いているごみの一部または全てをプログラムで処理できます。ディレクトリが指定される場合は、これは -x の直後、空白なしに 引き続かなければなりません。
(環境変数)
- HOME
-
chdirの引数がないときに使われます。 - LOGDIR
-
chdirの引数がなく、"HOME" がセットされていないときに使われます。 - PATH
-
サブプロセスを実行するときと、"-S" が指定されたときにプログラムを 探すのに使われます。
- PERL5LIB
-
Perl のライブラリファイルを探すときに標準ライブラリを 探す前に探すディレクトリのリストです。 特定の場所における version/archname/, version/, archname/ のような アーキテクチャ依存とバージョン依存のディレクトリは、もしあれば自動的に 追加されます; この検索はインタプリタ起動時に行われます。 さらに、
$Config{inc_version_list}のエントリにマッチングするディレクトリが 追加されます。 (これらは典型的には同じディレクトリツリーにより古い互換性のある perl が インストールされている場合のためのものです。)PERL5LIB が定義されていなければ、"PERLLIB" が使われます。 ディレクトリは(PATH と同様に)Unix 風のプラットフォームではコロンで区切られ、 Windows ではセミコロンで区切られます(適切なパス区切り文字は
perl -V:path_sepコマンドでわかります)。プログラムが setuid または setgid で実行されているか、"-T" または "-t" の スイッチが指定されて、汚染チェック付きで動作している場合、PERL5LIB も "PERLLIB" も使われません。 代わりにプログラム中で以下のようにするべきです:
use lib "/my/directory"; - PERL5OPT
-
コマンドラインオプション(スイッチ)です。 この変数のスイッチは全ての Perl コマンドラインで指定されたかのように 扱われます。 -[CDIMTUWdmtw] オプションのみが有効です。 (プログラムが setuid または setgid で実行されているか、 "-T" または "-t" スイッチが指定されて)汚染チェック付きで動作している場合、 この変数は無視されます。 PERL5OPT が -T で始まっている場合、汚染チェックが有効となり、引き続く オプションは無視されます。 PERL5OPT が -t で始まっている場合、汚染チェックが有効となり、 書き込み可能なドットは @INC から削除され、引き続くオプションも有効に なります。
- PERLIO
-
空白(またはコロン)で区切られた PerlIO 層のリストです。 perl が IO に PerlIO システムを使うようにコンパイルされている場合 (これがデフォルトです)、これらの層が perl の IO に影響を与えます。
層名をコロンで始める (例えば
:perlio) のは、変数の「属性」との 類似性を強調するための慣習です。 しかし層指定文字列をパースするコード(PERLIO 環境変数をデコードするためにも 使われます)は、コロンを区切りとして使います。PERLIO をセットしない、または空文字列をセットすると、プラットフォームの デフォルトの層の組み合わせと等価です; 例えば、Unix 風のシステムでは
:unix:perlioで、Windows やその他の DOS 風のシステムは:unix:crlfです。このリストは 全ての Perl の IO のデフォルトとなります。 従って組み込みの層のみがこのリストに記述可能です; なぜなら (
:encoding()のような)外部読み込みの層はロードするために IO が必要だからです! デフォルトとして外部エンコーディングを追加する方法については "open pragma" を参照してください。PERLIO 環境変数に加えることが妥当な層の簡単な一覧を以下に示します。 詳細については PerlIO を参照してください。
- :crlf
-
"テキスト"と"バイナリ"ファイルを識別する CRLF から
"\n"への変換を MS-DOS 及び似たようなオペレーティングシステムの方式で行い それらのアーキテクチャの:perlioと同様のバッファリングを提供する層です。 - :perlio
-
これは stdio 風のバッファリングを PerlIO 層として再実装したものです。 従ってどのような層からも操作時に呼び出されます(典型的には
:unix)。 - :stdio
-
この層はシステムの ANSI C "stdio" ライブラリコールをラップした PerlIO インターフェースを提供します。 この層はバッファリングと IO の両方を提供します。
:stdio層は CRLF 変換を 行わない ことに注意してください; たとえそれが プラットフォームの通常の振る舞いであっても、です。 これを行うためには:crlf層が必要です。 - :unix
-
read,write,lseekなどを呼び出す低レベル層です。
全てのプラットフォームでデフォルトの層の組み合わせは納得できる結果に なっているはずです。
Unix プラットフォームではこれは ":unix:perlio" または ":stdio" と等価です。 Configure スクリプトは、システムのライブラリがバッファへの高速アクセス方法を 提供する場合 (最近のアーキテクチャでは一般的ではありません) は ":stdio" 実装を使うよう設定します; そうでなければ ":unix:perlio" 実装を使います。
このリリース (5.30) では Win32 でのデフォルトは":unix:crlf"です。 Win32 の":stdio" は perl IO にとって、C コンパイラのベンダー/バージョン依存の 大量のバグ/仕様漏れがあります。 バッファとして自身の
:crlf層を使うことでこれらの問題を回避し、 物事をより一貫したものにします。このリリース (5.30) では Win32 での基底層として
:unixを使うことで、未だに C コンパイラの数値のファイル記述子ルーチンを使います。PERLIO 環境変数は、Perl が汚染モードで実行されるときには完全に無視されます。
- PERLIO_DEBUG
-
Perl が -Di コマンドラインオプション付きで実行されているときに、 ファイルまたはデバイスの名前をセットすると、PerlIO サブシステムのいくつかの 操作のログが、デフォルトである stderr ではなく、指定されたファイルに リダイレクトされます。 ファイルは追記モードで記録されます。 Unix での典型的な使い方は以下の通りです:
% env PERLIO_DEBUG=/tmp/perlio.log perl -Di script ...Win32 では以下がほぼ等価です:
> set PERLIO_DEBUG=CON perl -Di script ...この機能は、setuid されたスクリプトや "-T" で実行されているスクリプト、 あるいは
-DDEBUGGING対応なしでビルドされた Perl で実行された場合は 無効になります。 - PERLLIB
-
Perl のライブラリファイルを探すときに標準ライブラリを 探す前に探すディレクトリのリストです。 "PERL5LIB" が定義されていると、PERLLIB は使われません。
PERLLIB 環境変数は、Perl が汚染モードで実行されるときには完全に 無視されます。
- PERL5DB
-
デバッガコードを読み込むのに使われるコマンドです。 デフォルトは以下の通り:
BEGIN { require "perl5db.pl" }PERL5DB 環境変数は Perl が裸の "-d" スイッチで開始されたときにのみ 使われます。
- PERL5DB_THREADED
-
真の値にセットされると、デバッグするコードがスレッドを使うことをデバッガに 示します。
- PERL5SHELL (specific to the Win32 port)
-
Win32 版だけのもので、 "バッククォート" コマンドや system() を実行するために Perl が内部的に 使わなければならない代替シェルを指定します。 デフォルトは WindowsNT では
cmd.exe /x/d/c、Windows95 ではcommand.com /cです。 値はスペース区切りと考えられます。 空白やバックスラッシュのような、保護する必要がある文字の前には バックスラッシュがつけられます。COMSPEC の値はユーザーによってかなり様々で、移植性の問題を引き起こすので、 Perl はこの目的に COMSPEC は使わないことに注意してください。 さらに、Perl は対話的な用途には向かないシェルも利用できますが、 COMSPEC にそのようなシェルを指定すると他のプログラム (普通は対話的な用途に適したシェルを探すのに COMSPEC を使います)の適切な 利用を邪魔するかもしれません。
Perl 5.10.0 と 5.8.8 以前では、PERL5SHELL は外部コマンドを実行するときに 汚染チェックされませんでした。 Windows 上で汚染モードで実行するときには、明示的に
$ENV{PERL5SHELL}を 設定(または削除)することを勧めます。 - PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
-
1 にセットすると、IFS 非互換の LSP (Layered Service Providers) を 使えるようにします。 Perl は普通 IFS 互換の LSP を探します; Windows のソケットを本当の ファイルハンドルとしてエミュレートするために必要だからです。 しかし、これは全てのアプリケーションが IFS 非互換の自身の LSP を使うことを 求める McAfee Guardian のようなファイアウォールでは問題が起きます; 明らかに、Perl は普通そのような LSP を使うことを避けるからです。
この環境変数を 1 にセットすることで、 Perl は単にカタログに挙げられている もののうち最初の適切な LSP を使用し、これにより McAfee Guardian は 幸せなままです--そしてこの特定の場合においては、McAfee Guardian の LSP は 実際には動作するために IFS 互換である必要があるアプリケーションのために 小細工をしているので、 Perl も正しく動きます。
- PERL_DEBUG_MSTATS
-
Perl が Perl 配布パッケージに含まれる malloc ルーチンを使って コンパイルされている場合にのみ有効です; つまり
perl -V:d_mymallocが "define" の場合です。設定されると、実行後にメモリ状況が表示されます。 1 を超える数値が設定されると、コンパイル後にもメモリ状況を表示します。
- PERL_DESTRUCT_LEVEL
-
オブジェクトやその他のリファレンスのグローバルな デストラクタの振る舞いを制御します。 さらなる情報については "PERL_DESTRUCT_LEVEL" in perlhack を参照してください。
- PERL_DL_NONLAZY
-
1 にセットすると、 Perl は 全ての 未定義シンボルをダイナミック ライブラリをロードしたときに解決します。 デフォルトの振る舞いは使われるときにシンボルを解決します。 この変数を設定することで、拡張機能のテスト時にたとえテストスイートが 呼び出さなくても関数名のスペルミスによるエラーを確実に受け取ることが できるので便利です。
- PERL_ENCODING
-
use encodingプラグマを明示的なエンコーディング名を指定せずに使用した場合、 PERL_ENCODING 環境変数がエンコーディング名として使われます。 - PERL_HASH_SEED
-
(Perl 5.8.1 から; 新しい意味論は Perl 5.18.0 から) Perl の内部ハッシュ関数のランダム化をオーバーライドするために使います。 値は 16 進数で表現され、先頭の 0x を含んでいてもかまいません。 切りつめられたパターンは、必要な分の 0 が前置されているものとして扱われます。
オプションが指定されて、
PERL_PERTURB_KEYSが設定されていないと、 値 '0' はPERL_PERTURB_KEYS=0/PERL_PERTURB_KEYS=NOとして扱い、その他の値はPERL_PERTURB_KEYS=2/PERL_PERTURB_KEYS=DETERMINISTICとして扱います。DETERMINISTICモードに関する重要な問題点については PERL_PERTURB_KEYS の文書を参照してください。ハッシュの種は微妙な問題であることに注意してください。 ハッシュは Perl コードに対するローカル・リモート攻撃から守るために ランダム化されます。 手動で種を設定することによりこの守りは部分的に、あるいは完全に失われます。
さらなる情報については "Algorithmic Complexity Attacks" in perlsec, "PERL_PERTURB_KEYS", "PERL_HASH_SEED_DEBUG" を参照してください。
- PERL_PERTURB_KEYS
-
(Perl 5.18.0 から)
"0"または"NO"を設定すると、同じPERL_HASH_SEEDでのキーの探索順序は毎回同じになります。 ハッシュへの挿入は、ハッシュの容量が増える場合を除き、順序を変更しません。 PERL_HASH_SEED を設定することと組み合わせると、可能な限り 5.18 より前の 振る舞いに近づきます。"1"または"RANDOM"を設定すると、キーの探索はランダム化されます。 ハッシュにキーが挿入される毎に、順序はランダムに変わります。 順序は、PERL_HASH_SEED が指定されていても、プログラムを再び実行したときに 再現できません。 これは、PERL_HASH_SEED が明示的に設定されていない場合は、 perl のデフォルトのモードです。"2"または"DETERMINISTIC"に設定すると、ハッシュへのキーの挿入によって キーの順序が変わりますが、同じハッシュキーが使われ、 コード自体が非決定的な操作をせず、正確に同じ環境コンテキストを 提供すれば、プログラムを再び実行したときには再現可能です。 環境変数を追加または削除すると、おそらくキーの順序が変わりますう。 コードのどこかが非決定的なキーを使ったハッシュ、 例えばリファレンスの文字列化形式や、それを含むオブジェクトのアドレスを キーにしたハッシュを構築すると、これはおそらくプロセス中の 「全ての」ハッシュのキーの順序にグローバルな影響を与えます。 これが正しく動作するには、決定的な結果を生成するために PERL_HASH_SEED と共に使われなければならず、 実際の所、PERL_HASH_SEEDを明示的に設定した場合、 これも設定する必要はありません; 自動的にこのモードに設定されます。注意: このオプションはセキュアではないと考えられていて、Perl のハッシュ関数の 非決定的な振る舞いのデバッグ専用であることを意図しています。 製品で使わないでください。
さらなる情報については "Algorithmic Complexity Attacks" in perlsec, "PERL_HASH_SEED", "PERL_HASH_SEED_DEBUG" を参照してください。 Hash::Util にある
hash_traversal_mask()を使うことで、特定のハッシュに 対するキー探索マスクを取得および設定できます。 - PERL_HASH_SEED_DEBUG
-
(Perl 5.8.1 から。) これを
"1"に設定すると、実行開始時にハッシュ関数、種、どの種類のキー横断 ランダム化が有効かに関する情報を画面(STDERR)に出力します。 これは "PERL_HASH_SEED" および "PERL_PERTURB_KEYS" と組み合わせることで ハッシュのランダム化による非決定的な振る舞いのデバッグを助けることを 目的としています。ハッシュ関数に関する情報、特にハッシュの種は 微妙な問題 であることに 注意してください: これを知ることで、リモートからでも Perl のコードに対して サービス拒否攻撃を仕掛けることが出来ます; さらなる情報については "Algorithmic Complexity Attacks" in perlsec を参照してください。 知る必要のない人々に対して ハッシュの種を公開しないでください。
hash_seed()とhash_traversal_mask()も 参照してください。出力の例は以下のようなものです:
HASH_FUNCTION = ONE_AT_A_TIME_HARD HASH_SEED = 0x652e9b9349a7a032 PERTURB_KEYS = 1 (RANDOM) - PERL_MEM_LOG
-
Perl が -Accflags=-DPERL_MEM_LOG で設定されていると、環境変数
PERL_MEM_LOGを設定することでデバッグメッセージのログ出力を有効にします。 値は<number>[m][s][t]の形式で、numberは書き込みたい ファイル記述子番号 (デフォルトは 2)、文字の組み合わせはメモリ (m) と SV(s) で、 オプションとしてタイプスタンプ (t) です。 例えば、PERL_MEM_LOG=1mstは全てのログ情報を標準出力に出力します。 応用として、開いている他のファイル記述子に書き込むこともできます:$ 3>foo3 PERL_MEM_LOG=3m perl ... - PERL_ROOT (specific to the VMS port)
-
Perl と VMS 専用の @INC のための論理デバイスを含む、 変換が隠されたルートとなる論理名です。 VMS の Perl に影響を与えるその他の論理名としては PERLSHR, PERL_ENV_TABLES, SYS$TIMEZONE_DIFFERENTIAL がありますが、これらはオプションです; 詳細については Perl ソース配布パッケージの perlvms と README.vms で 議論されています。
- PERL_SIGNALS
-
Perl 5.8.1 以降で有効です。 これに
unsafeをセットすると、Perl 5.8.0 以前のシグナルの振る舞い (直接的ですが安全ではありません)が復元されます。safeをセットすると安全な(しかし遅延する)シグナルが使われます。 "Deferred Signals (Safe Signals)" in perlipc を参照してください。 - PERL_UNICODE
-
-C コマンドラインスイッチと等価です。 これは真偽値変数ではないことに注意してください。 これを
"1"にセットすることは(どんな意味においても)「Unicode を 有効にする」ための正しい方法ではありません。 しかし、「Unicode を無効にする」ために"0"をセットすることは出来ます (あるいは Perl の起動前にあなたのお使いのシェルで PERL_UNICODE を 未設定にすることでも出来ます)。 さらなる情報については -C スイッチの説明を 参照してください。 - PERL_USE_UNSAFE_INC
-
perl がデフォルトで
@INCにカレントディレクトリを 含まないように設定されている場合、 これを再設定するためにこの変数を"1"にできます。 これは、@INCに "." がなくても動作するように更新されていないモジュールの ビルドとテストのために使うことを第一の目的としているので、 日常使用環境では設定するべきではありません。 - SYS$LOGIN (specific to the VMS port)
- PERL_INTERNAL_RAND_SEED
-
様々な目的のために、perl によって内部で使われる乱数生成器の種となる 非負整数を設定します。
perl が setuid または setgid で実行されている場合は無視されます。
-Tや-tperl が汚染モードを有効にして開始された場合、 一部の制限されたランダム化の設定(ハッシュキー)のみに使われます。Perl はこの変数を無視するようにビルドされているかもしれません。
- PERL_RAND_SEED
-
整数が設定されると、この値は、 明示的な
srand()呼び出しがなかったり、引数なしでの明示的なsrand()呼び出しが行われたとき、rand()のための perl 内部の乱数生成器の種として使われます。通常、
srand()の前にrand()を呼び出したり、引数なしで明示的にsrand()を呼び出した場合、 比較的高品質な乱数の種によって生成器の状態に 種を設定するために、乱数生成器は「ベストエフォート」を行います。 この環境変数が設定されると、使われる種は、 アプリケーションプロセスとそのフォークやスレッドがそれぞれ固有の ユニークな種を持ち続けれるけれども、 プログラムが 2 回実行されても、rand()に関しては (他の全てが同じなら) 同じ結果になるような方法で、決定論的に計算されます。PERL_RAND_SEED は性能計測とデバッグを意図したもので、 安定したテストを意図したものでは明示的に異なります。 保証されることは、特定の perl バイナリが 2 回同じ結果を 出力することだけであり、 perl リリースが異なったりアーキテクチャがことなったりしたときの 結果は保証しません。
perl が setuid または setgid で実行されている場合は無視されます。
特定の自然言語に特有のデータを Perl がどのように扱うかを制御する 環境変数もあります; perllocale を参照してください。
Perl および様々なモジュールと、テストフレームワークを含む構成要素は、 ときどきその他の特定の環境変数を使うかもしれません。 その一部は特定のプラットフォームに固有です。 そのような特定の状況に特有の変数については適切なモジュールの文書と (perlsolaris, perllinux, perlmacosx, perlwin32 などのような) プラットフォームの文書を参照してください。
Perl は、実行されたプログラムへの全ての環境変数を利用可能にし、 子プロセスが開始されたときにはそれらを渡します。 しかし、setuid で動作するプログラムは何かをする前に、単に人々に変な気を 起こさせないために以下のコードを入れておくのがよいです。
$ENV{PATH} = "/bin:/usr/bin"; # or whatever you need
$ENV{SHELL} = "/bin/sh" if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};(適用の順序)
一部のオプション、特に -M, PERL5LIB, PERL5OPT は相互作用するので、 これらが適用される順序は重要です。
この節は、perl インタプリタの中で 実際に 何が起きるかを 記述しているのではなく、事実上 何が起きるかを記述していることに 注意してください。
- -I
-
複数
-Iオプションを指定した効果は、 これらを右から左に@INCにunshiftします。 それで、例えば:perl -I 1 -I 2 -I 3はまず
@INCの先頭に3を追加し、それから2を追加し、 それから1を追加します。 結果として、@INCは次で始まります:qw(1 2 3) - -M
-
複数の
-Mオプションは、左から右に処理されます。 それで、これは:perl -Mlib=1 -Mlib=2 -Mlib=3まず
@INCの先頭に1を追加するために lib プラグマが使われ、 それから2を追加し、それから3追加して、結果として@INCは 次のもので始まります:qw(3 2 1) - the PERL5LIB environment variable
-
これはコロンで区切られたディレクトリのリストを含みます。 リスト全体は一度に
@INCの先頭に追加されます。 これは:PERL5LIB=1:2:3 perl@INCが次のもので始まる結果となります:qw(1 2 3) - combinations of -I, -M and PERL5LIB
-
(-I, -M, PERL5LIB の組み合わせ)
PERL5LIBは最初に適用され、それから全ての-I引数、それから全ての-M引数です。 これは:PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2@INCが次のもので始まる結果となります:qw(m2 m1 i1 i2 e1 e2) - the PERL5OPT environment variable
-
これはスペースで区切られたオプションのリストです。 この節では
-Mと-Iの効果だけを考慮します。コマンドラインからの
-Iオプションの通常の処理の後、PERL5OPTの全ての-Iオプションが展開されます。 これらは右から左ではなく、左から右に処理されます。 また、コマンドラインでは-I とディレクトリの間に空白が許されますが、PERL5OPTでは許されないことにも注意してください。コマンドラインからの
-Mオプションの通常の処理の後、PERL5OPTの全ての-Mオプションが展開されました。 これらは左から右に処理されます; つまり コマンドラインと同じです。この例でよりはっきりするでしょう:
export PERL5OPT="-Mlib=optm1 -Iopti1 -Mlib=optm2 -Iopti2" export PERL5LIB=e1:e2 perl -I i1 -Mlib=m1 -I i2 -Mlib=m2@INCが次のもので始まる結果となります:qw( optm2 optm1 m2 m1 opti2 opti1 i1 i2 e1 e2 ) - Other complications
-
(その他の複雑なもの)
前述の例で無視されている複雑なものがいくつかあります:
- arch and version subdirs
-
(arch と version subdirs)
-I,PERL5LIB,use libの全ては、 (存在すれば) arch と version サブディレクトリが前置されます。 - sitecustomize.pl
Hey! The above document had some coding errors, which are explained below:
- Around line 3582:
-
Unterminated C<...> sequence