使用perl修改文件中的字符串

时间:2016-05-12 18:41:32

标签: perl

我有一个文件,d00.dat,我需要更改d02的字符串d01 ...使用以下代码,它会在控制台中打印修改但它们在文件d00.dat中不会更改...我怎么能这样做?

my $line = 0;
my $filename = "d00.dat";
open(my $fh, '<', $filename) || die "file could not open $! \n";
while( $line = <$fh>) {
if( $line =~ s/d01/d02/g ){
print "$line\n";
}

3 个答案:

答案 0 :(得分:1)

最简单,最快速的解决方案是将文件读入内存,进行更改,然后将更改写回文件。

my $qfn = "d00.dat";

my $file;
{
   open(my $fh, '<', $qfn)
      or die("Can't open \"$qfn\": $!\n");

   local $/;
   $file = <$fh>;
}

$file =~ s/d01/d02/g;

{
   open(my $fh, '>', $qfn)
      or die("Can't create \"$qfn\": $!\n");

   print($fh $file);
}

作为一个单行:

perl -i -pe's/d01/d02/g' d00.dat

答案 1 :(得分:0)

Perl有一个可以就地修改文件的开关。我认为这就是你要找的东西:

perl -i.bak -p -e 's/d01/d02/g;' d00.dat

这将

  • d00.dat重命名为d00.dat.bak
  • 阅读d00.dat.bak
  • d01
  • 替换d02的每一次出现
  • 将结果行打印到d00.dat

说明:

  • -i就地编辑文件,并且如果给出了一些后缀,则可以选择进行备份。 例如。 -i.bak将创建$file.bak-i.before将创建$file.before等。 如果没有后缀(仅-i),则无备份,请考虑这种危险。

  • -p放置一个类似

    的循环
    while(<>) {
        # your code
        print;
    }
    
    在这种情况下

  • 围绕您的代码(s/…/…/g;
  • -e仅表示&#34;执行以下语句&#34;

答案 2 :(得分:0)

如果您正考虑更改这些地方,则无法更换整个文件。

您可以将每行(包括更改)打印到另一个文件,然后将其复制。或者,您可以读取所有行,根据需要更改它们,然后覆盖该文件。

my $filename = "d00.dat";

open(my $fh, '<', $filename) || die "file could not open $! \n";
my @new_lines = map { s/d01/d02/g; $_ } <$fh>;
close $fh;

open(my $fh_out, '>', $filename) || die "file could not open $! \n";
print $fh_out $_  for @new_lines;

由于open已关闭文件句柄(如果已经打开),您也可以执行

open(my $fh, '<', $filename) || die "file could not open $! \n";
my @new_lines = map { s/d01/d02/g; $_ } <$fh>;

open($fh, '>', $filename) || die "file could not open $! \n";
print $fh $_  for @new_lines;