当我尝试将内容写入文件时,文件变回空白。不知道这里发生了什么。我知道正则表达式正在运行。我怀疑问题与我写文件的方式有关。
#!/usr/bin/perl
@files = </home/vnc/Downloads/test/*.json>;
my $myfile;
foreach $file (@files) {
print $file . "\n";
open(IN,'<',$file) or die $!;
while(<IN>) {
$_ =~ s/^(.*?)\[//;
$_ =~ s/\](?=[^.]*$)//;
$myfile = $_;
# print $myfile;
}
close(IN);
open(OT,'>',$file) or die $!;
while(<OT>) {
print(OT $myfile);
}
close(OT);
# $file =~ s/^(.*?)\[//;
}
答案 0 :(得分:1)
据我了解,你的做法是错误的。您使用正则表达式替换某些内容时处理整个文件,但您没有将其写入任何位置。稍后你以写模式打开一个文件,但循环没用,因为它是空的。
在我看来,处理这种情况的最简单方法是使用修改文件的$^I
变量。这里有一个例子作为一个班轮(未测试):
perl -i.bak -pe 's/^(.*?)\[//; s/\](?=[^.]*$)//' /home/vnc/Downloads/test/*.json
答案 1 :(得分:1)
要从perl脚本中就地修改文件列表,您也可以使用此方法。文件内容加载到数组@content
,修改后写入原始文件:
#!/usr/bin/perl
use strict;
# Example: Modifying a list of files in-place within a perl script
foreach my $file (</home/vnc/Downloads/test/*.json>) {
# Open read-write (+<)
open my $f, "+< $file" or die "$!\n";
# read the lines:
my @content = <$f>;
# change the lines:
@content = map { s/foo/bar/; $_ } @content;
# empty the file
truncate $f, 0;
# rewind to beginning of file
seek $f, 0, 0;
# print new content to file
print $f @content;
close $f;
}