Perl脚本提供空白输出文件

时间:2016-05-02 13:50:39

标签: regex perl

我是Perl的总菜鸟,试图为特定项目学习一些新代码。简而言之,我正在制作一个脚本(在osx上),即搜索文件夹中的所有xml文件并审查特定的数字。我知道一个单行可能有帮助,但文件数量将非常庞大(数千个文件),并且会定期发生,因此执行此操作的脚本会更好。此外,还有学习脚本部分:)

我已经设法打开我的文件,使正则表达式在原始的每一行上都能满足我的特定需求,并为我的新信息生成一个可写的临时文件。这是事情停止工作的地方。我试图在循环之后将新文件复制到旧文件上,但我最终得到一个空白(!)文件。我怀疑temp文件有错误,但看起来很完美。我甚至尝试过,作为一个新手出路,在更改开放模式(读取)后,逐行将进程从temp恢复到原始文件,但是这也是一个空文件。

现在我的头脑空虚了。任何帮助将不胜感激:)

#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;

chdir "/perltest/test"; #debugsafety

#file
my $workingfiles = "*.XML";
my @files = glob("$workingfiles");

#process files
my $old;
my $tmpfile;

foreach my $file (@files) {
  print "$file \n";

  open ($old, "<", $file) or die "No file";
  open ($tmpfile, ">", 'temp.tmp') or die;
  while(my $line = <$old> ) {
    my $subz = $line;
    $subz =~ s/([[:upper:]]{2}[[:digit:]]{6})|([[:upper:]]{1}[[:digit:]]{7})|(?:(?<![[:digit:]])[[:digit:]]{8}(?![[:digit:]])|([[:upper:]]{2}[[:digit:]]{5}[AB]))/**CENS**/g;
    print $subz;
    print $tmpfile $subz;
  }
    print "Start copying.\n";

    open (my $old, ">", $file) or die "No file";
    open (my $tmpfile, "<", 'temp.tmp') or die;

    #copy $tmpfile, $old or die "Couldn't copy";
    my $y = 0; #debug
    while (my $line = <$tmpfile> ) {
      print $y++; #debug
      my $subz = $line;
      print $subz;
      print $old $subz;
    }
}

print "Complete.\n";
exit;

2 个答案:

答案 0 :(得分:2)

在关闭文件句柄之前,请重新打开它们。我是一名伪装成perl开发人员的Oracle DBA,所以我无法理解其背后的原因。但我知道如果你关闭文件句柄,你的脚本应该按原样运行。

close ($old); # add this line
close ($tmpfile); # add this line

print "Start copying.\n";

当你完成“复制”回到它们时再次关闭它们是一个好习惯。

答案 1 :(得分:0)

当您完成写入文件句柄时,请明确关闭文件句柄。在您这样做之前,事情仍然会被缓冲。

也会更有意义
rename($file, "$file.old");
rename("temp.tmp", $file);

而不是循环遍历文件(或使用File :: Copy :: copy)来制作它的备份副本。

最后,对于简单的编辑,我可以建议您努力在命令行上做到这一点,这样您就不需要抓挠头脑并且想知道&#34;现在我在该脚本中做了什么时间?&#34 ;.从长远来看,它可以节省大量时间。

perl -p -i.bak -e 's/pattern/text/;' files*

是一般形式。