UNIX系の OS では、Perlスクリプトファイルの先頭に #! と perl の パス名 を記述し、ファイルの パーミッション を変更することで、スクリプトを自己起動方式のコマンドにすることができます。
#!/usr/local/bin/perl ← パス名はシステムで異なります print "Hello world!!\n";
パーミッションはchmodコマンドを用いて変更します。
% chmod 755 hello.pl
自己起動方式スクリプトは通常のコマンドとして起動することができます。
% perl hello.pl ← 通常はperlコマンドから起動しますが、 Hello world!! % hello.pl ← コマンドとして実行可能になります Hello world!! % ./hello.pl ← PATH に . が無い場合は ./~ で実行 Hello world!! %
この方法は、UNIX系 OS環境でのみ使用可能です。UNIX系の Webサーバーで Perlスクリプトを CGI として動作させるには、自己起動方式にしておく必要があります。#! の前にはコメントも空行も空白も入れないようにしてください。perl のパス名は環境によって異なります。不明な場合は「Perl のパス名を調べる」を参照してください。環境変数PATHにドット(.)が含まれない場合は、./hello.pl として実行してください。
Windows の場合、#! による方法はサポートされていないので、通常は、perl コマンドの引数としてスクリプトファイル名を指定する必要があります。
C:\Test>perl hello.pl ← 通常は perl コマンドの引数として起動する
Windows NT/2000/XP の場合、ActivePerl が適切にインストールされていれば .pl という拡張子に perl コマンドが関連づけられ、コマンドラインから直接スクリプト名を指定して起動することができます。
C:\Test>hello.pl ← コマンドとして起動可能になる
さらに、環境変数 PATHEXT に .pl を追加設定しておけば、拡張子 .pl を省略することも可能になります。
C:\Test>SET PATHEXT=.pl;%PATHEXT% ← 環境変数の設定 C:\Test>hello ← .pl も省略可能になる
古い Windows では上記の方法は使えません。hello.pl に加えて、hello.bat という バッチファイル を作成することで、擬似的に hello.pl をコマンドとして起動できるようになります。hello.bat ファイルの内容を以下に示します。%* はバッチファイルに渡された引数を意味します。
perl hello.pl %*
これにより、Perl スクリプトを次のようにして起動することができます。
C:\Temp>hello ← perl コマンドを指定しなくてもよくなる
hello により、hello.bat が実行され、その中に記述された内容に従って、perl hello.pl が引数つきで呼ばれています。
コマンドの 引数 は配列変数 @ARGV($ARGV[0]~$ARGV[n])で参照します。個々の引数は $ARGV[n] で参照します。n は 0 から始まる数値で、最大値は $#ARGV になります。
# コマンドの引数をすべて表示する for ($i = 0; $i <= $#ARGV; $i++) { print "ARGV[$i] = $ARGV[$i]\n"; }
実行結果は次のようになります。
% perl args1.pl aaa bbb ccc ARGV[0] = aaa ARGV[1] = bbb ARGV[2] = ccc %
引数がひとつも指定されていない場合、$#ARGV が -1 となります。
if ($#ARGV == -1) { print "引数がありません。\n"; exit(1); } $n = $#ARGV + 1; print "引数が $n 個あります。\n";
下記に実行例を示します。
% perl args2.pl 引数がありません。 % perl args2.pl aaa bbb ccc 引数が 3 個あります。 %
a で始まるファイルすべてを a* で表すような表記法を ワイルドカード と呼びます。ワイルドカードの展開は、UNIX 系 OS では自動的に行われますが、Windows 版の ActivePerl では行われません。ワイルドカード展開機能をもつ <...> を用いて明示的に展開する必要があります。
@ARGV = <@ARGV>; for ($i = 0; $i <= $#ARGV; $i++) { print "ARGV[$i] = $ARGV[$i]\n"; }
アスタリスク(*)は 0文字以上の任意文字にマッチします。a* は a、abc、a123 などに、args* は args1.pl、argsxxx などにマッチします。
% perl args3.pl args* ARGV[0] = args1.pl ARGV[1] = args2.pl ARGV[2] = args3.pl %
クエスチョン(?)は 1文字の任意文字にマッチします。a? は aa、a1、ax などにマッチします。
% perl args3.pl args?.pl ARGV[0] = args1.pl ARGV[1] = args2.pl ARGV[2] = args3.pl %
ワイルドカード展開の <a*> は、ファイル読み込みの <FILEHANDLE> とは別のものなので、混同しないようにしてください。