実行にあたって、Perl は指定されたスクリプトを以下に示す場所 で探します:
- 1. コマンドライン上で -e スイッチで指定された行。 2. コマンドライン上で最初のファイル名として示されたファイル
の中。
- (#! 記法をサポートしているシステムでは、このよう にしてインタプリタを呼び出します。)
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) が行なわれます。