[pod] [xml]

NAME

perlrun - Perl インタプリタの起動方法

SYNOPSIS

perl-sTtuUWX ] [ -hv ] [ -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] [ -P ] [ -S ] [ -x[dir] ] [ -i[extension] ] [ -eE 'command' ] [ -- ] [ programfile ] [ argument ]...

DESCRIPTION

Perl プログラムを実行する普通の方法は、直接実行できる形にするか、 コマンドラインの引数としてソースファイルの名前を渡すことです。 (対話的な Perl 環境もあります -- どのようにするかの詳細については perldebug を参照して下さい。) 実行にあたって、Perl は指定されたプログラムを以下に示す場所で 探します:

  1. コマンドライン上で -e-E のスイッチで指定された行。

  2. コマンドライン上で最初のファイル名として示されたファイルの中。 (#! 記法をサポートしているシステムでは、このようにして インタプリタを呼び出します。 Location of Perl を参照して下さい。)

  3. 標準入力から暗黙に渡される。 ファイル名を示す引数が無い場合にのみうまくいきます。 STDIN から読み込むプログラムに引数を渡すには、 プログラム名として明示的に "-" を指定しなくてはなりません、

2 番目、3 番目の方法では、-x スイッチを指定した場合を除いて、 Perl は入力ファイルを最初から解析し始めます。  -x スイッチを 指定した場合には、まず、最初に #! と "perl" という文字列を 含む行を探し、そこから解析を始めます。 これは、大きなテキストにプログラムを埋め込んで、実行するようなときに便利です。 (この場合、プログラムの終わりは、トークン __END__ を使って 示すとよいでしょう。)

#! を含む行のスイッチが必ず解析されるようになりました。 つまり、#! の行で引数が一つしか許されない、あるいはもっと悪く、 #! の行が認識されないといったシステムで運用している場合にも、-x で プログラムの開始位置を見つけた場合を含め、どのように Perl が起動されたかに よらず、一貫したスイッチの動作を期待できるようになっています。

歴史的なオペレーティングシステムの中にはカーネルによる #! 行の解釈が、 エラーなしに 32 文字で打ち切られてしまうものがありますので、あるスイッチは コマンドラインに渡され、あるスイッチは渡されないといったことが起こります。 注意しないと、文字が続かない "-" だけが渡されるといったことも 起こり得ます。 すべてのスイッチが、確実に 32 文字境界の前か後ろかのどちらかに なるようにしたいことでしょう。 多くのスイッチは、余分に処理されても問題ありませんが、完全なスイッチの 代わりに "-" が入っていた場合には、プログラムの代わりに、標準入力を Perl に 実行させることになってしまいます。 -I スイッチが中途半端になった場合にもおかしな結果となり得ます。

2 回実行されることに注意する必要のあるスイッチもあります。 例えば -l-0 の組み合わせです。 (可能なら) 両方のスイッチが 32 文字境界の後ろにいくようにするか、 -0digitsBEGIN{ $/ = "\0digits"; } で置き換えてください。

#! スイッチの解析は、行内で "perl" が示された位置から始まります。 とりわけ "-*" と "- " という文字の並びは無視されますので、以下のように 書くと:

    #!/bin/sh -- # -*- perl -*- -p
    eval 'exec perl -wS $0 ${1+"$@"}'
        if $running_under_some_shell;

Perl に -p スイッチを渡すことができます。

似たようなトリックは(持っていれば) env プログラムでも使えます。

    #!/usr/bin/env perl

上の例は Perl インタプリタに相対パスを使って、 ユーザーの PATH で最初にあったバージョンを使います。 もし特定のバージョンの Perl、例えば perl5.005_57 が使いたいなら、 #! 行のパスに直接書くべきです。

#! 行に "perl" という語が含まれていなければ、#! の後に指定された プログラムが Perl インタプリタの代わりに実行されます。 これは少し変わっていますが、#! が行なえないマシンを使っている方には 有効でしょう。 プログラムに対して使っている SHELL が /usr/bin/perl だと言っておけば、 Perl が正しいインタプリタを起動してくれるからです。

プログラムの場所が特定できたなら、Perl はプログラム全体を内部形式に コンパイルし始めます。 コンパイルエラーが見つかった時には、プログラムの実行は行なわれません。 (これは、構文エラーがある場合にも、途中まで実行される可能性のある、 典型的なシェルのスクリプトと異なる点です。)

プログラムが構文的に正しければ、実行されることになります。 プログラムが、exit() 演算子にも die() 演算子にも当たらないで最後まで 到達すると、正常に完了したことを示すために、暗黙の exit(0) が 行なわれます。

#! and quoting on non-Unix systems hashbang #!

(非 Unix システムでの #! とクォート)

Unix の #! のテクニックは他のシステムでもシミュレートされています。

非 Unix システムのコマンドインタプリタはクォートに関して Unix シェルと異なった考え方をしています。 お使いのコマンドインタプリタの特殊文字について (*, \, " は 一般的です)、そして一行で起動するために(後述する -e を参照して下さい) 空白や特殊文字を保護する方法について学ぶ必要があるでしょう。

システムによってはシングルクォートをダブルクォートに変更する必要が あるかもしれません。 しかし Unix や Plan9 のシステムでは してはいけません。 また、単体の % を %% に変更する必要があるかもしれません。

例えば:

    # Unix
    perl -e 'print "Hello world\n"'
    # MS-DOS, etc.
    perl -e "print \"Hello world\n\""
    # Macintosh
    print "Hello world\n"
     (then Run "Myscript" or Shift-Command-R)
    # VMS
    perl -e "print ""Hello world\n"""

問題は、これらはどれも信頼性がないことです。 これはコマンドに依存し、どれも動かないかもしれません。 4DOS がコマンドシェルなら、おそらくよりよく動きます:

    perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

Windows NT の CMD.EXE は誰も見ていない間に多くの標準 Unix 機能が 入り込んでいますが、クォートのルールに関しては ドキュメントを探してみてください。

Macintosh では、使っている環境に依存します。 MacPerl shell や MPW はクォート関係の対応に関して かなり Unix シェルと似ています。 しかし、Macintosh の非 ASCII 文字をコントロール文字として 自由に使うことができます。

この辺りのことに関する一般的な解決方法はありません。 まったくぐちゃぐちゃです。

Location of Perl perl, location of interpreter

(Perl の位置)

当たり前のように聞こえるかもしれませんが、 Perl はユーザーが簡単に発見できる場合にのみ有用です。 可能なら、/usr/bin/perl と /usr/local/bin/perl の両方に 実際のバイナリへのシンボリックリンクを置くというのはよい考えです。 もしこれが無理なら、システム管理者は Perl と付随するユーティリティ (への シンボリックリンク) を、典型的にユーザーの PATH で見付かるディレクトリか、 その他の明らかで便利な場所に置くべきです。

このドキュメントでは、#!/usr/bin/perl とプログラムの先頭に書けば システムの全てのメソッドが実行できるものとしています。 特定のバージョンを使いたい場合は、特定のパスを使うか:

    #!/usr/local/bin/perl5.00554

あるいは単に最低限のバージョンを指定した場合は、 以下のような行をプログラムの先頭に置いてください:

    use 5.005_54;

Command Switches perl, command switches command switches

(コマンドスイッチ)

全ての標準コマンドと同様に、1 文字のスイッチは、次に続くスイッチが あれば、それとつなげることができます。

    #!/usr/bin/perl -spi.orig	# same as -s -p -i.orig

スイッチ一覧:

ENVIRONMENT perl, environment variables

(環境変数)

特定の自然言語に特有のデータを Perl がどのように扱うかを制御する 環境変数もあります。 perllocale を参照して下さい。

これらの他には、実行されているプログラムあるいは子プロセスがが有効に しない限り、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)};