<> の構文で処理されたファイルを置き換えるための拡張子を 指定します。
これは、入力ファイルをリネームし、元の名 前で出力ファイルを 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 を使うことができます。
(perlfunc manpage の eof の項の例を参照してください。)