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

DESCRIPTION
実行にあたって、Perl は指定されたスクリプトを以下に示す場所 で探します:
  1. 1. コマンドライン上で -e スイッチで指定された行。 2. コマンドライン上で最初のファイル名として示されたファイル の中。
  2. (#! 記法をサポートしているシステムでは、このよう にしてインタプリタを呼び出します。) 3. 標準入力から非明示に渡される。
  3. ファイル名を示す引数が無 い場合にのみうまくいきます。STDIN からのスクリプトに引 数を渡すには、スクリプト名として明示的に "-" を指定しな くてはなりません。
2 番目、3 番目の方法では、-x スイッチを指定した場合を除いて、 Perl は入力ファイルを最初から解析し始めます。
-x スイッチを 指定した場合には、まず、最初に #! と "perl" という文字列を含 む行を探し、そこから解析を始めます。
これは、大きなテキスト にスクリプトを埋め込んで、実行するようなときに便利です。 (この場合、スクリプトの終わりは、トークン __END__ を使って示 すとよいでしょう。) Perl 5 からは、#! を含む行のスイッチが必ず解析されるようにな りました。
つまり、#! の行で引数が一つしか許されない、ある いはもっと悪く、#! の行が認識されないといったシステムで運用 している場合にも、-x でスクリプトの開始位置を見つけた場合を 含め、どのように Perl が起動されたかによらず、一貫したスイッ チの動作を期待できるようになっています。 多くの OS で、カーネルによる #! 行の解釈が、エラーなしに 32 文字で打ち切られてしまいますので、あるスイッチはコマンドライ ンに渡され、あるスイッチは渡されないといったことが起こります。 注意しないと、文字が続かない "-" だけが渡されるといったこと も起こり得ます。
すべてのスイッチが、32 文字境界の前か後ろ かを確かめたいことでしょう。
多くのスイッチは、余分に処理さ れても問題ありませんが、完全なスイッチの代わりに - が入って いた場合には、スクリプトの代わりに、標準入力を Perl に実行さ せることになってしまいます。
-I スイッチが中途半端になった 場合にもおかしな結果となり得ます。 #! スイッチの解析は、行内で "perl" が示された位置から始まり ます。
とりわけ "-*" と "- " という文字の並びは無視されます ので、
         #!/bin/sh -- # -*- perl -*- -p
         eval 'exec perl $0 -S ${1+"$@"}'
             if 0;
のように書けば、Perl に -p スイッチを渡すことができます。
#! 行に "perl" という語が含まれていなければ、#! の後に指定さ れたプログラムが Perl インタプリタの代わりに実行されます。 これは少し変わっていますが、#! が行なえないマシンを使ってい る方には有効でしょう。
プログラムに対して使っている SHELL が /usr/bin/perl だと言っておけば、Perl が正しいインタプリタ を起動してくれるからです。
スクリプトの場所が特定できたなら、Perl はスクリプト全体を内 部形式にコンパイルし始めます。
コンパイルエラーが見つかった 時には、スクリプトの実行は行なわれません。
(これは、構文エ ラーがある場合にも、途中まで実行される可能性のある、典型的な シェルのスクリプトと異なる点です。)
スクリプトが構文的に正しければ、実行されることになります。 スクリプトが、exit() 演算子にも die() 演算子にも当たらないで 最後まで到達すると、正常に完了したことを示すために、暗黙の exit(0) が行なわれます。

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