0

の質問:C:\text_file.txt PERL スクリプトが呼び出されたときにコマンド ラインでパラメーターとして指定され、text_file.txt「Hello World World World」というテキストが含まれている場合、「World」のすべてのインスタンスを「Earth」に置き換えるにはどうすればよいですか?

私はPERLが初めてです。ファイルパスのパラメーターを受け入れるスクリプトを書いています。ファイルの内容に対して検索置換を実行したい。私はこのようなことができることを知っています:$string =~ s/World/Earth/g;しかし、私がそれを助けることができるなら、ファイルを文字列に読みたくありません. 文字列として読み込まずに、ファイルに対して直接これを行う方法はありますか? ありがとう!

4

1 に答える 1

3

これが Perl の-i(「インプレース編集」) スイッチの目的です。

$ perl -i.bak -pe 's/World/Earth/g' text_file.txt

編集: この同一の機能をより大きな Perl スクリプトに組み込むには:

{
    local $^I = '.bak';
    local @ARGV = ('text_file.txt');
    local $_;
    while (<>) {
        s/World/Earth/g;
        print;
    }
}

この$^I変数は、-iコマンド ライン スイッチの値を反映します。ここでは、手動で設定しています。また、@ARGV通常はコマンド ラインから取得されるファイルのリストに手動で設定されています。すべてがブロックにラップされているため、$^I@ARGV設定された と はlocal、後で元の値に戻ります。これは、プログラムの残りの部分によっては、厳密には必要ない場合があります。また、ループが以前保持していた値を壊さ$_ないようにするためだけにローカライズしました。whileこれも必要ないかもしれません。

バックアップ ファイルの作成を避けたい場合は、コマンド ラインからの-i代わりに使用できることに注意してください。-i.bak対応するコードは、$^I = ""代わりに$^I = '.bak'.

于 2012-08-30T23:56:25.403 に答える