実行にあたって、Perl は指定されたスクリプトを以下に示す場所で探します:
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) が行なわれます。
1 文字のスイッチは、次に続くスイッチがあれば、それとつなげることができま す。
#!/usr/bin/perl -spi.bak # -s -p -i.bak と同じ
Go to the first, previous, next, last section, table of contents.