1

我正在尝试获取一个文件,并将其复制到输出文件中,然后找到所有文件并将<k>它们放入其中<p>。我想使用正则表达式。

  while (<INPUTFILE>)
  {
         if($_ != "<p>")
         {
                print OUTPUTFILE "$_\n";  
          }

          else
          {
              print OUTPUTFILE "<k>";  
            }

  }

我正在尝试这样的事情,但我猜 $_ 变量一次占用每一行。所以最好使用写整个文件然后尝试正则表达式搜索和替换?为此我尝试过:

  $_ =~ s/<k>/<p>/g;
4

4 回答 4

5

一次一行不是问题。

while (<>)
   s/<k>/<p>/g;
   print;
}
于 2013-10-24T19:41:20.037 回答
1

正如@ikegami 建议的那样,一次一行没有问题。或者,您可以在一次搜索和替换中执行此操作:

{
   local $/ = undef;
   my $data = <INPUTFILE>;
   $data =~ s/<k>/<p>/g;
}

这将在单个操作中进行搜索和替换,并且对于较大的文件可能更快和/或更有效。

于 2013-10-24T19:44:41.303 回答
0

如果您真的想一次性处理整个文件:

BEGIN { $/ = undef; $\ = undef; }
LINE: while (defined($_ = <ARGV>)) {
    s/<k>/<p>/g;
    print $_;
}

从 :

perl -0777 -MO=Deparse -pe 's/<k>/<p>/g; print;'
于 2013-10-24T19:41:55.620 回答
0

从命令行

perl -pe 's/<k>/<p>/g' <infile >outfile

简单... :-)

如果您担心换行效果,请查找“更改记录分隔符”

于 2013-10-24T19:46:42.370 回答