Perl5 perlrun - Perl インタプリタの実行方法
[DESCRIPTION][スイッチ]
SYNOPSIS
perl [switches] filename args

スイッチ
1 文字のスイッチは、次に続くスイッチがあれば、それとつなげる ことができます。
         #!/usr/bin/perl -spi.bak    # -s -p -i.bak と同じ
▼スイッチ一覧:
-0digits
レコードセパレータ ($/) を 8 進数で示します。
digits を指定しないと、ヌル文字がセパレータになります。
他の スイッチを前に置いてもかまいませんし、digits のあとにつ なげてもかまいません。
たとえば、ファイル名をヌル文字 で区切って表示できる find があれば:
              find . -name '*.bak' -print0 | perl -n0e unlink
のようにできます。
00 という特別な値は、Perl にパラグラフモードで、ファイ ルを読ませます。
0777 という値は、該当する文字がないた め、Perl にファイル全体を読ませることになります。
-a
-n や -p といっしょに用いると、自動 split モードになります。-n や -p で作られる暗黙のループ内の最初の文とし て、配列 @F への暗黙の split コマンドが実行されます。
              perl -ane 'print pop(@F), "\n";'
は、
              while (<>) {
                  @F = split(' ');
                  print pop(@F), "\n";
              }
と等価です。-F を使って区切文字を変更することができま す。
-c
Perl にスクリプトの構文のチェックを行なわせ、実行せずに抜けるようにします。
-d
Perl デバッガの下でスクリプトを実行します。
perldebugmanpage を参照してください。
-Dnumber
-Dlist
デバッグフラグを設定します。
スクリプトがどのように実 行されるかを見るには、-D14 を使ってください。
(これは、-DDEBUGGINGを指定して Perl にデバッグ機能を盛り込んでコンパイルしたときにだけ働きます。
) この他に役に立つ値 としては、コンパイルされた構文トリーを表示する、-D1024 があげられます。
-D512 は、コンパイルした正規表現を表 示します。
数字の代わりに文字のリストを指定することも できます (たとえば、-D14 は -Dtls と等価です):
                  1  p  トークン化と構文解析
                  2  s  スタックの表示
                  4  l  ラベルスタックの処理
                  8  t  実行のトレース
                 16  o  演算子ノードの構造
                 32  c  文字列/数値変換
                 64  P  -P のためのプリプロセッサコマンドの表示
                128  m  メモリ配置
                256  f  フォーマットの処理
                512  r  正規表現の解析
               1024  x  構文トリーのダンプ
               2048  u  汚染チェック
               4096  L  メモリリーク (既にサポートされていない)
               8192  H  ハッシュのダンプ -- values() の横取り
              16384  X  スクラッチパッドの配置
              32768  D  全消去
-e commandline
1 行のスクリプトを指定するのに使用します。
-e が指定さ れると Perl は引数のリストからはスクリプトのファイル名 を探しません。
複数の -e コマンドで、複数行のスクリプ トを構成することができます。
通常のプログラムでセミコ ロンを置くところには、セミコロンを使うことに気を付けて ください。
-Fregexp
-a が有効なときに、split を行なう正規表現を指定します。
正規表現の前後に // があっても、そのスラッシュは無視さ れます。
-iextension
<> の構文で処理されたファイルを置き換えるための拡張子を 指定します。
これは、入力ファイルをリネームし、元の名 前で出力ファイルを open し、print() 文のデフォルトとし てその出力ファイルを select することで行ないます。
extension が指定されると、昔の内容のバックアップを行な うファイル名の拡張子として、元のファイル名に付け加えら れます。extension が指定されないと、バックアップを作 りません。
シェルからは
              $ perl -p -i.bak -e "s/foo/bar/; ... "
とすれば、
              #!/usr/bin/perl -pi.bak
              s/foo/bar/;
とスクリプトで書くのと同じで、これは、
              #!/usr/bin/perl
              while (<>) {
                  if ($ARGV ne $oldargv) {
                      rename($ARGV, $ARGV . '.bak');
                      open(ARGVOUT, ">$ARGV");
                      select(ARGVOUT);
                      $oldargv = $ARGV;
                  }
                  s/foo/bar/;
              }
              continue {
                  print;  # 元のファイル名に出力する
              }
              select(STDOUT);
と書くのと、-i の形式が、いつファイル名が変わったかを知 るために、$ARGV と $oldargv を比較する必要がないのを除 いて、同値です。
しかしながら、選択するファイルハンド ルとして ARGVOUT は使用します。
ループのあとは、STDOUT がデフォルトのファイルハンドルとして再設定されます。
個々のファイルの終わりに何かを付け加えたいときや、行番 号をリセットしたいような場合に、個々の入力ファイルの終 わりを知るために、括弧の無い eof を使うことができます。
(perlfunc manpage の eof の項の例を参照してください。)
-Idirectory
-P といっしょに使って、C プリプロセッサにインクルードフ
ァイルを探す場所を示します。
デフォルトでは、 /usr/include と /usr/lib/perl が検索されます。
-loctnum
自動の行末処理を行なうようにします。
これには、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'
これはまず、$\ に改行 ($/ のデフォルト値) を設定し、そ れから $/ にヌル文字を設定します。
-n
以下のようなループが、実際のスクリプトの回りにあるかのように Perl に指示します。
sed -n や awk のようにファ イル名引数上で繰り返しを行なうことになります:
              while (<>) {
                  ...             # ここでスクリプトが実行される
              }
デフォルトでは、各行が印字されることはありません。
各 行の印字を行なうには -p を参照してください。
以下にあ げるのは、1 週間以上たったファイルを効率的に削除するも のです:
              find . -mtime +7 -print | perl -nle 'unlink;'
これは、ファイル名が見つかるごとにプロセスを起動しなく て済みますので、find の -exec スイッチを使うよりも速く なります。
Awk と同じように、暗黙に実行されるループの前後に実行さ れるコードを指定するために、BEGIN ブロックと END ブロッ クを使うことができます。
-p
以下のようなループが、実際のスクリプトの回りにあるかのように Perl に指示します。
sed のようにファイル名引数 上で繰り返しを行なうことになります:
              while (<>) {
                  ...             # ここでスクリプトが実行される
              } continue {
                  print;
              }
各行は、自動的に印字されることになります。
印字を抑制 するには、-n スイッチを使ってください。
-p は -n スイ ッチを無効にします。
Awk と同じように、暗黙に実行されるループの前後に実行さ れるコードを指定するために、BEGIN ブロックと END ブロッ クを使うことができます。
-P
Perl によるコンパイルを行なう前に、スクリプトを C プリプロセッサにかけるようにします。
(コメントも CPP のデ ィレクティブも # で始まりますから、コメントの最初を C プリプロセッサが認識してしまう "if", "else", "define" といった単語で始めるべきではありません。)
-s
コマンドライン上のスクリプト名の後から、ファイル名引数(または --) の前までのスイッチのための、原始的な解析を 行なえるようにします。
ここで見つかったスイッチは、 @ARGV から取り除かれ、対応する Perl スクリプトの変数に 設定されます。
以下のスクリプトは、-xyz というスイッチ を付けて実行された時にだけ、"ture" と表示するものです。
              #!/usr/bin/perl -s
              if ($xyz) { print "true\n"; }
-S
Perl がスクリプトを探すときに環境変数 PATH を参照するようにします (スクリプト名がスラッシュで始めるときを除き ます)。
これは、#! をサポートしていないマシンで、#! に よる実行をエミュレートするために、以下のようにして使い ます:
              #!/usr/bin/perl
              eval "exec /usr/bin/perl -S $0 $*"
                      if $running_under_some_shell;
システムは、最初の行を無視し、スクリプトを /bin/sh に渡 し、/bin/sh は Perl スクリプトをシェルスクリプトとして実 行しようとします。
シェルは 2 行目を通常のシェルコマン ドとして実行し、Perl インタプリタを起動することになりま す。
$0 にフルパス名が入っているとは限らないシステムも ありますので、-S が Perl に必要に応じてスクリプトを探す ように指示します。
Perl がスクリプトを見つけると、これ らの行の解析を始めますが、$running_under_some_shell が 真になることがないため、無視することになります。
$* を 使うよりもファイル名内に埋め込まれたスペースなどを扱う ことのできる ${1+"$@"} の方がよいのですが、スクリプトが csh で解釈される場合には、うまくいきません。
csh では なく、sh を起動するように、いくつかのシステムでは、#! の行を Perl も無視することになっている、コロンだけの行 で置き換える必要があるかもしれません。
そういった制御 が効かないシステムでは、csh でも sh でも Perl でも使え る、回りくどい方法を使うことが必要です:
                 eval '(exit $?0)' && eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
                 & eval 'exec /usr/bin/perl -S $0 $argv:q'
                         if 0;
-T
「汚染」チェックをオンにします。
通常、このチェックはsetuid や setgid のスクリプトを実行するときにだけ、行な われます。
perlsec manpage を参照してください。
-u
スクリプトのコンパイル後、コアダンプを行なうようにします。
このコアダンプを持ってきて、(Perl の配布では提供 されていませんが) undump プログラムを使って、実行ファイ ルに変換することができます。
これは多少ディスク容量を 食いますが (実行ファイルを sprit することで少しは減りま す)、実行開始を速くすることができます。
(減らしても、 "hello world" の実行ファイルは、私のマシンで 200K 程に なります。) ダンプする前に部分的にスクリプトを実行して おきたい場合には、このスイッチの代わりに dump() 演算子 を使ってください。
undump が実行できるのは特定の環境下 ですし、これが使えない移植バージョンの Perl もあるでし ょう。
-U
Perl に安全でない演算を許可します。
現在のところ、「安全でない」演算には、スーパーユーザとして実行中にディレ クトリを削除することと、致命的な汚染チェックを警告に替 えて、setuid プログラムを実行することが含まれます。
-v
Perl 実行ファイルのバージョンとパッチレベルを表示します。
-w
1 度しか使われない識別子、設定される前に使われている変数に警告を出します。
サブルーティンの再定義、未定義の ファイルハンドルの参照や、read-only でオープンしたファ イルハンドルへの書き込みにも警告を出します。
また、数 値に見えない値を数値として使った場合、配列をスカラであ るかのように使った場合、100 段階以上のサブルーティンの 再帰、その他たくさんの事に警告を出します。
perldiag manpage と perltrap manpage を参照してください。
-x directory
テキスト中にスクリプトが埋め込まれている事を Perl につ たえます。
最初の #! で始まり、"perl" という文字列を含 む行までの、先行するゴミは捨てられます。
その行にある 意味を持つスイッチは、(通常の #! 処理と同じく 1 つのま とまりだけですが) 適用されます。
directory が指定され ると、Perl はスクリプトの実行前に、そのディレクトリに移 ります。
-x スイッチは先行するゴミの処分を制御するだけ です。
スクリプトの後に無視すべきゴミがある場合には、 __END__ でスクリプトを終了する必要があります (その、後 に続くゴミの一部または全部は、必要に応じて DATA ファイ ルハンドルを通して、そのスクリプトで処理する事ができま す)。

出典:Perl manpages Last change: Release 5.0 Patchlevel 00 5