find . -name '*.bak' -print0 | perl -n0e unlinkのようにできます。 00 という特別な値は、Perl にパラグラフモードで、ファイルを読ませます。 0777 という値は、該当する文字がないため、Perl にファイル全体を読ませるこ とになります。
perl -ane 'print pop(@F), "\n";'は、
while (<>) {
@F = split(' ');
print pop(@F), "\n";
}
と等価です。`-F' を使って区切文字を変更することができます。
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 全消去
$ 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 の項の例を参照してください。)
perl -lpe 'substr($_, 80) = ""'とします。 $\ = $/ という代入は、`-l' スイッチが処理されるときに実行されるとき に行なわれますので、`-l' スイッチの後に `-0' スイッチを置くよ うにすれば、入力レコードセパレータを、出力レコードセパレータと違うように もできます:
gnufind / -print0 | perl -ln0e 'print "found $_" if -p'これはまず、$\ に改行 ($/ のデフォルト値) を設定し、それから $/ にヌル文 字を設定します。
while (<>) {
... # ここでスクリプトが実行される
}
デフォルトでは、各行が印字されることはありません。各行の印字を行なうには
`-p' を参照してください。以下にあげるのは、1 週間以上たったファイル
を効率的に削除するものです:
find . -mtime +7 -print | perl -nle 'unlink;'これは、ファイル名が見つかるごとにプロセスを起動しなくて済みますので、 find の -exec スイッチを使うよりも速くなります。 awk と同じように、暗黙に実行されるループの前後に実行されるコードを指定す るために、BEGIN ブロックと END ブロックを使うことができます。
while (<>) {
... # ここでスクリプトが実行される
} continue {
print;
}
各行は、自動的に印字されることになります。印字を抑制するには、`-n'
スイッチを使ってください。`-p' は `-n' スイッチを無効にします。
awk と同じように、暗黙に実行されるループの前後に実行されるコードを指定す
るために、BEGIN ブロックと END ブロックを使うことができます。
#!/usr/bin/perl -s
if ($xyz) { print "true\n"; }
#!/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;
Go to the first, previous, next, last section, table of contents.