web-dev-qa-db-ja.com

Perlの既存のファイルの文字列を置き換える方法は?

1_classification.dat、2_classification.datなどの名前のすべてのテキストファイルで、Wordの「青」を「赤」に置き換えたいと思います。同じファイルを編集したいので、このコードを試しましたが、機能しません。どこがおかしいの?

@files=glob("*_classification.dat");
foreach my $file (@files)
{
    open(IN,$file) or die $!;
    <IN>;
    while(<IN>)
    {
       $_='~s/blue/red/g';
       print IN $file;
    }

   close(IN)
}
49
user831579

ワンライナーに問題はありますか?

$ Perl -pi.bak -e 's/blue/red/g' *_classification.dat

説明

  • -pプロセス、その後<>行ごとに印刷
  • -iは、インプレース編集を有効にします。ファイルは.bak拡張子を使用してバックアップされます
  • 正規表現の置換は、ファイルの内容である暗黙的な変数に1行ずつ作用します
121
Zaid

ここでの既存の回答はどれも、スクリプト(ワンライナーではない)からこれを行う方法の完全な例を提供していません。ここに私がやったことがあります:

rename($file, $file.'.bak');
open(IN, '<'.$file.'.bak') or die $!;
open(OUT, '>'.$file) or die $!;
while(<IN>)
{
    $_ =~ s/blue/red/g;
    print OUT $_;
}
close(IN);
close(OUT);
12
cmbryan

$_='~s/blue/red/g';

あ、何?

ただ

s/blue/red/g;

または、変数の使用を主張する場合($ _を使用する場合は必要ありませんが、正しい構文を表示したいだけです):

$_ =~ s/blue/red/g;
11
bart