我是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;
答案 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*
是一般形式。