- -0digits
-
レコードセパレータ ($/) を 8 進数で示します。digitsを指定しないと、ヌル
文字がセパレータになります。他のスイッチを前に置いてもかまいませんし、
digits のあとにつなげてもかまいません。たとえば、ファイル名をヌル文字で
区切って表示できる find があれば:
find . -name '*.bak' -print0 | perl -n0e unlink
のようにできます。
00 という特別な値は、Perl にパラグラフモードで、ファイルを読ませます。
0777 という値は、該当する文字がないため、Perl にファイル全体を読ませるこ
とになります。
- -a
-
`-n' や `-p' といっしょに用いると、自動 split モードになります。
`-n' や `-p' で作られる暗黙のループ内の最初の文として、配列
@F への暗黙の split コマンドが実行されます。
perl -ane 'print pop(@F), "\n";'
は、
while (<>) {
@F = split(' ');
print pop(@F), "\n";
}
と等価です。`-F' を使って区切文字を変更することができます。
- -c
-
Perl にスクリプトの構文のチェックを行なわせ、実行せずに抜けるようにしま
す。
- -d
-
Perl デバッガの下でスクリプトを実行します。See section デバッグ,を参照してくだ
さい。
- -Dnumber
-
- -Dlist
-
デバッグフラグを設定します。スクリプトがどのように実行されるかを見るには、
`-D14' を使ってください。(これは、`-DDEBUGGING' を指定して
Perl にデバッグ機能を盛り込んでコンパイルしたときにだけ働きます。)この他
に役に立つ値としては、コンパイルされた構文トリーを表示する、
`-D1024' があげられます。`-D512' は、コンパイルした正規表現を
表示します。数字の代わりに文字のリストを指定することもできます (たとえば、
`-D14' は `-Dtls' と等価です):
1 p トークン化と構文解析
2 s スタックの表示
4 l ラベルスタックの処理
8 t 実行のトレース
16 o 演算子ノードの構造
32 c 文字列/数値変換
64 P -P のためのプリプロセッサコマンドの表示
128 m メモリ配置
256 f フォーマットの処理
512 r 正規表現の解析
1024 x 構文トリーのダンプ
2048 u 汚染チェック
4096 L メモリリーク (既にサポートされていない)
8192 H ハッシュのダンプ -- values() の横取り
16384 X スクラッチパッドの配置
32768 D 全消去
- -e commandline
-
1 行のスクリプトを指定するのに使用します。`-e' が指定されると Perl
は引数のリストからはスクリプトのファイル名を探しません。複数の `-e'
コマンドで、複数行のスクリプトを構成することができます。通常のプログラム
でセミコロンを置くところには、セミコロンを使うことに気を付けてください。
- -Fregexp
-
`-a' が有効なときに、split を行なう正規表現を指定します。正規表現の
前後に // があっても、そのスラッシュは無視されます。
- -iextension
-
<> の構文で処理されたファイルを置き換えるための拡張子を指定します。これ
は、入力ファイルをリネームし、元の名前で出力ファイルを open し、print()
文のデフォルトとしてその出力ファイルを select することで行ないます。
extension が指定されると、昔の内容のバックアップを行なうファイル名の
拡張子として、元のファイル名に付け加えられます。extension が指定され
ないと、バックアップを作りません。シェルからは
$ 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 を比較する必要がないのを除いて、同値です。しかしながら、
選択するファイルハンドルとして ARGVOUT は使用します。ループのあとは、
STDOUTがデフォルトのファイルハンドルとして再設定されます。
個々のファイルの終わりに何かを付け加えたいときや、行番号をリセットしたい
ような場合に、個々の入力ファイルの終わりを知るために、括弧の無い eof を
使うことができます。
(See section 組み込み関数,の eof の項の例を参照してください。)
- -Idirectory
-
`-P' といっしょに使って、C プリプロセッサにインクルードファイルを探
す場所を示します。デフォルトでは、/usr/include と /usr/lib/perl が検索さ
れます。
- -loctnum
-
自動の行末処理を行なうようにします。これには、2 つの機能があります。 1
つには、`-n' や `-p' を使ったときに、自動的に行末文字を chomp
します。2 つめに octnum を"$\" に代入し、print 文で行末文字を追加で
きるようにします。octnum を指定しなかった場合には、その時点の "$/"
の値を "$\" に設定します。たとえば、行を 80 カラムに切り詰めるには:
perl -lpe 'substr($_, 80) = ""'
とします。
$\ = $/ という代入は、`-l' スイッチが処理されるときに実行されるとき
に行なわれますので、`-l' スイッチの後に `-0' スイッチを置くよ
うにすれば、入力レコードセパレータを、出力レコードセパレータと違うように
もできます:
gnufind / -print0 | perl -ln0e 'print "found $_" if -p'
これはまず、$\ に改行 ($/ のデフォルト値) を設定し、それから $/ にヌル文
字を設定します。
- -n
-
以下のようなループが、実際のスクリプトの回りにあるかのように Perl に指示
します。sed -n や awk のようにファイル名引数上で繰り返しを行なうことにな
ります:
while (<>) {
... # ここでスクリプトが実行される
}
デフォルトでは、各行が印字されることはありません。各行の印字を行なうには
`-p' を参照してください。以下にあげるのは、1 週間以上たったファイル
を効率的に削除するものです:
find . -mtime +7 -print | perl -nle 'unlink;'
これは、ファイル名が見つかるごとにプロセスを起動しなくて済みますので、
find の -exec スイッチを使うよりも速くなります。
awk と同じように、暗黙に実行されるループの前後に実行されるコードを指定す
るために、BEGIN ブロックと END ブロックを使うことができます。
- -p
-
以下のようなループが、実際のスクリプトの回りにあるかのように Perl に指示
します。sed のようにファイル名引数上で繰り返しを行なうことになります:
while (<>) {
... # ここでスクリプトが実行される
} continue {
print;
}
各行は、自動的に印字されることになります。印字を抑制するには、`-n'
スイッチを使ってください。`-p' は `-n' スイッチを無効にします。
awk と同じように、暗黙に実行されるループの前後に実行されるコードを指定す
るために、BEGIN ブロックと END ブロックを使うことができます。
- -P
-
Perl によるコンパイルを行なう前に、スクリプトを C プリプロセッサにかける
ようにします。(コメントも CPP のディレクティブも # で始まりますから、コ
メントの最初を Cプリプロセッサが認識してしまう "if", "else", "define"と
いった単語で始めるべきではありません。)
- -s
-
コマンドライン上のスクリプト名の後から、ファイル名引数(または --) の前ま
でのスイッチのための、原始的な解析を行なえるようにします。ここで見つかっ
たスイッチは、@ARGV から取り除かれ、対応する Perl スクリプトの変数に設
定されます。以下のスクリプトは、`-xyz' というスイッチを付けて実行さ
れた時にだけ、"ture" と表示するものです。
#!/usr/bin/perl -s
if ($xyz) { print "true\n"; }
- -S
-
Perl がスクリプトを探すときに環境変数 PATH を参照するようにします (スク
リプト名がスラッシュで始めるときを除きます)。これは、#! をサポートしてい
ないマシンで、#! による実行をエミュレートするために、以下のようにして使
います:
#!/usr/bin/perl
eval "exec /usr/bin/perl -S $0 $*"
if $running_under_some_shell;
システムは、最初の行を無視し、スクリプトを /bin/sh に渡し、/bin/sh は
Perl スクリプトをシェルスクリプトとして実行しようとします。シェルは 2 行
目を通常のシェルコマンドとして実行し、Perl インタプリタを起動することに
なります。$0 にフルパス名が入っているとは限らないシステムもありますので、
`-S' が Perl に必要に応じてスクリプトを探すように指示します。Perl
がスクリプトを見つけると、これらの行の解析を始めますが、
$running_under_some_shell が真になることがないため、無視することになりま
す。$* を使うよりもファイル名内に埋め込まれたスペースなどを扱うことので
きる ${1+"$@"} の方がよいのですが、スクリプトがcsh で解釈される場合には、
うまくいきません。csh ではなく、sh を起動するように、いくつかのシステム
では、#! の行を 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;
- -T
-
「汚染」チェックをオンにします。通常、このチェックはsetuid や setgid の
スクリプトを実行するときにだけ、行なわれます。See section セキュリティ,を参照
してください。
- -u
-
スクリプトのコンパイル後、コアダンプを行なうようにします。このコアダンプ
を持ってきて、(Perl の配布では提供されていませんが) undump プログラムを
使って、実行ファイルに変換することができます。これは多少ディスク容量を食
いますが (実行ファイルを sprit することで少しは減ります)、実行開始を速く
することができます。(減らしても、"hello world" の実行ファイルは、私のマ
シンで 200K 程になります。)ダンプする前に部分的にスクリプトを実行してお
きたい場合には、このスイッチの代わりに dump() 演算子を使ってください。
undump が実行できるのは特定の環境下ですし、これが使えない移植バージョン
の Perl もあるでしょう。
- -U
-
Perl に安全でない演算を許可します。現在のところ、「安全でない」演算には、
スーパーユーザとして実行中にディレクトリを削除することと、致命的な汚染チェッ
クを警告に替えて、setuid プログラムを実行することが含まれます。
- -v
-
Perl 実行ファイルのバージョンとパッチレベルを表示します。
- -w
-
1 度しか使われない識別子、設定される前に使われている変数に警告を出します。
サブルーティンの再定義、未定義のファイルハンドルの参照や、read-only でオー
プンしたファイルハンドルへの書き込みにも警告を出します。また、数値に見え
ない値を数値として使った場合、配列をスカラであるかのように使った場合、
100 段階以上のサブルーティンの再帰、その他たくさんの事に警告を出します。
See section デバッグ,とSee section 不注意によるわな,を参照してください。
- -x directory
-
テキスト中にスクリプトが埋め込まれている事を Perl につたえます。最初の
#! で始まり、"perl" という文字列を含む行までの、先行するゴミは捨てられま
す。その行にある意味を持つスイッチは、(通常の #! 処理と同じく 1 つのまと
まりだけですが) 適用されます。directory が指定されると、Perl はスクリプ
トの実行前に、そのディレクトリに移ります。`-x' スイッチは先行するゴ
ミの処分を制御するだけです。スクリプトの後に無視すべきゴミがある場合には、__
END__ でスクリプトを終了する必要があります (その、後に続くゴミの一部また
は全部は、必要に応じて DATA ファイルハンドルを通して、そのスクリプトで処
理する事ができます)。