1 文字オプションは次に続くオプションがあれば、それとくっつけてもよい。
特に #!
機構を使って起動する時は引数が一つしか許されないので、
便利である。
#!/usr/bin/perl -spi.bak # -s -p -i.bak と同じ ...
perl には以下のコマンドラインオプションがある。
-0
: レコードセパレータの指定`-0 数字'
レコードセパレータ($/
)を8進数で指定する。See section $/ : 入力レコードのセパレータ.
数字を指定しない場合はヌルキャラクタがセパレータになる。 数字の前や後に他のスイッチがあってもよい。
例えば、ファイル名の最後にヌルキャラクタを付けてプリントする find
があるなら、次のように使える。
find . -name '*.bak' -print0 | perl -n0e unlink
00
は特殊な値で、perl はファイルをパラグラフモードで読み込む。
0777
を指定すると、
その値を持つ文字はないので perl は全ファイルを読み込む。
-a
: オートスプリットモード`-a'
-n
や -p
と一緒に用いて、
オートスプリットモードを ON にする。
-n
や -p
により自動的に行われる while
ループ内で、
最初に自動的に split
コマンドが実行される。
perl -ane 'print pop(@F), "\n";'
は次の例と同等である。
while (<>) { @F = split(' '); print pop(@F), "\n"; }
-c
: 文法チェック`-c'
スクリプトの文法をチェックし、実行せずに終了する。
-d
: デバッグモード`-d'
perl デバッガのもとでスクリプトを実行する。
Debugging
の章を参照のこと。
See section perl デバッガ.
-D
: デバッグフラグをセットする`-D数字'
デバッグフラグをセットする。
スクリプトがどのように実行されるかを見るには、 `-D14' を使えばよい (これはデバッグ情報をつけて perl をコンパイルした時にのみ動作する)。
`-D1024' も有用な値である。 これを使うと、コンパイルされた文法ツリーをリストする。
また、`-D512' を使うと、コンパイルされた正規表現を出力する。
-e
: コマンドラインからスクリプトを入力`-e コマンドライン'
1 行のスクリプトを入力するのに用いる。
複数行のスクリプトを指定するには -e
を複数指定すればよい。
-e
が指定されると、
perl は引数のリストからスクリプトファイル名を探さない。
-i
: 入力ファイルを修正し、バックアップファイルを作成する`-i拡張子'
<>
構造で処理されるファイルをその場で修正することを指定する。
入力ファイルの名前を変えて、出力ファイルを元の名前でオープンし、
print
文のデフォルトの出力ファイルとすることで処理する。
拡張子が与えられれば、バックアップファイルの名前として 元のファイル名にその拡張子を加えたものが使われる。
拡張子がなければ、バックアップはされない。
perl -p -i.bak -e "s/foo/bar/;"
... を実行することは
次のスクリプトと同じで、
#!/usr/bin/perl -pi.bak s/foo/bar/;
これは次のものと同等である。
#!/usr/bin/perl while (<>) { if ($ARGV ne $oldargv) { rename($ARGV, $ARGV . '.bak'); open(ARGVOUT, ">$ARGV"); select(ARGVOUT); $oldargv = $ARGV; } s/foo/bar/; } continue { print; # 元の名前のファイルに出力する } select(STDOUT);
ただし、-i
を用いた方法では
ファイル名がいつ変更されたかを調べるために $ARGV
と $oldargv
を
比較する必要がない点が異なる。-i
を用いた場合、
実際にセレクトするファイルハンドルとして ARGVOUT
を使っている。
STDOUT
がループの後で
デフォルトの出力ファイルハンドルに戻されている点に注意。
入力ファイルすべてに追加を行ったり、行番号をリセットしたりする場合、
各々の入力ファイルの終わりを知るために eof
を使うことができる。
(eof
での例を参照。See section eof.)
-I
: C プリプロセッサにインクルードファイルの位置を知らせる`-Iディレクトリ'
-P
と一緒に用いて C プリプロセッサに
インクルードファイルの位置を知らせる。
デフォルトでは `/usr/include' と `/usr/lib/perl' を検索する。
-l
: 行末処理を自動的に行なう`-l 8進数'
行末処理を自動的に行う。二つの効果がある:
-n
または -p
と一緒に用いた場合、
行ターミネータを自動的に除く。$\
に 8 進の値をセットし、
print 文が全て最後に行ターミネータをつけるようにする。
8 進数を省略すると、$/
の値を $\
にセットする。例えば、行を 80 コラムに切り揃えるためには:
perl -lpe 'substr($_, 80) = ""'
注意:
$\ = $/
の代入はスイッチが処理される時に行なわれるので、
-l
の後に -0
がある場合、
入力レコードセパレータが出力レコードセパレータと違う値を持つ場合がある:
gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
この場合は $\
を改行、$/
をヌルキャラクタにセットする。
See section $\ : print 関数の最後に出力するセパレータ for $\
, and See section $/ : 入力レコードのセパレータ.
-n
: sed -n や awk のエミュレート`-n'
スクリプトの前後に下に示すループがあるものとして perl を起動する。 こうすると、引数のファイル全部について繰り返しが行われる (sed -n や awk のように)。
while (<>) { ... # スクリプトがここにくる }
デフォルトでは入力行の出力がなされないことに注意。
出力したければ、-p
を用いる。
以下に示す例は一週間以上前のファイルを効率的に全て消去する方法である。
find . -mtime +7 -print | perl -nle 'unlink;'
こうすると find
の -exec
スイッチを使うよりも速い。
なぜなら、ファイル名が見つかるたびにプロセスを起動する必要がないからである。
-p
: sed のエミュレート`-p'
スクリプトの前後に下に示すループがあるものとして perl を起動する。 こうすると、引数のファイル全部について繰り返しが行われる(sed のように)。
while (<>) { ... # スクリプトがここにくる } continue { print; }
入力行が自動的に出力されることに注意。
出力しないようにするには -n
を用いる。
-p
は -n
に優先する。
-P
: コンパイル前に C プリプロセッサを通す`-P'
perl のコンパイルの前に C プリプロセッサを通す。
(perl のコメントも cpp
の命令も #
で始まるので、
コメントを C プリプロセッサが理解する単語、
例えば `if' や `else' や `define' で
始めないようにしなければならない。)
-s
: コマンドラインオプションの解析結果を変数にセットする`-s'
コマンドラインのスクリプト名の後、 ファイル名の引数(または `--')の前のスイッチについて初歩的な解析を行う。
スイッチが見つかると、@ARGV
から除かれ、
対応する変数を perl スクリプト内でセットする。
次のスクリプトでは、`-xyz' スイッチをつけてスクリプトを起動した時、
またその時のみ `true' を出力する。
#!/usr/bin/perl -s if ($xyz) { print "true\n"; }
-S
: スクリプトを環境変数 PATH
を用いて探す`-S'
スクリプトを探すのに、環境変数 PATH
を用いる
(スクリプト名が `/' で始まらないかぎり)。
これは特に #!
をサポートしないマシンにおいて #!
を
エミュレートするのに用いられる。その使い方は以下の通りである。
#!/usr/bin/perl eval "exec /usr/bin/perl -S $0 $*" if $running_under_some_shell;
システムは 1 行目を無視し、スクリプトを `/bin/sh' に渡す。 `/bin/sh' は perl スクリプトをシェルスクリプトとして実行しようとする。 シェルは 2 行目を通常のシェルコマンドとして実行し、 perl インタプリタを起動する。
システムによっては $0
は必ずしもフルパスを含まないので、
-S
を用いて perl に必要ならばスクリプトを探すように指示する。
perl がスクリプトを見つけると、解析を行い、
変数 $running_under_some_shell
が真になることはないので、
2 行目を無視する。
ファイル名に含まれるスペースなどを正しく扱うには、
$*
よりも ${1+"$@"
} のほうがよいだろうが、
csh が解釈する場合には動作しない。
sh ではなくて csh で起動するには、あるシステムでは #!
行を
コロンのみを含む行に書き換える必要があるかもしれない。
perl はこの行を無視する。その他のシステムではこの方法は使えず、
次のように、csh、sh、perl のどの下でも動作するような、
とてもややこしい方法をとる必要がある。
eval '(exit $?0)' && eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' & eval 'exec /usr/bin/perl -S $0 $argv:q' if 0;
-u
: スクリプトのコンパイル後、コアダンプする`-u'
スクリプトのコンパイルの後、コアダンプする。
このコアダンプから、`undump' プログラム(提供していない)を用いて
実行可能ファイルに変換できる。こうすると、
ディスク消費が増えるかわりに(実行ファイルを strip
すれば最小にできる)
スタートアップが速くなる。(しかし、
私のマシンでは `hello world' の実行形式が 200k の大きさになる。)
この実行形式を set-id プログラムとして走らせるのなら、 通常の perl ではなく `taintperl' を用いてコンパイルした方が良い。
ダンプする前に実行したいスクリプトがある場合は、
代わりに dump
コマンドを使えばよい。
注意 : undump
が使えるかどうかはプラットフォームによるので、
マシンによっては利用できないものもある。See section dump.
-U
: 安全でない操作を可能にする`-U'
安全でない操作を可能にする。
現在の所、"安全でない"操作とは、スーパーユーザの権限で走らせている際
にディレクトリを unlink
すること、および"汚れ"チェックの結果、
警告が出るような setuid プログラムを走らせることだけである。
-v
: perl のバージョンとパッチレベルを表示する`-v'
perl のバージョンとパッチレベルを出力する。
-w
: 識別子に関するさまざまな警告を出す`-w'
識別子について以下の場合に警告を出す。
-x
: スクリプトがメッセージ内に埋め込まれていることを知らせる`-xディレクトリ'
スクリプトがメッセージ内に埋め込まれていることを perl に知らせる。
#!
で始まり、
`perl' という文字列を含む最初の行が現れるまでのゴミは無視される。
その行に指定した意味のあるスイッチはすべて適用される
(ただし通常の #!
処理と同じく、スイッチのかたまりひとつだけである)。
ディレクトリ名を指定すると、 perl はスクリプトを実行する前にそのディレクトリに移る。
-x
は先頭のゴミのみを捨てる。
スクリプトの後にゴミがある場合は、
スクリプトを __END__
で終わらなければならない
(望むなら、スクリプトで後ろのゴミの一部または全部を
ファイルハンドル DATA
経由で処理することは可能である)。
See section 文字列の扱い for __END__
.