你想要做的事情的想法本身就是有缺陷的。文件开头为
H i / t h i s / ...
如果您要就地更改它,则在处理第一行后它将如下所示:
< H i > / i s / ...
注意到你是如何破坏“th”的吗?您需要制作文件的副本,修改副本,然后用副本替换原始文件。
最简单的方法是在内存中制作此副本。
my $file;
{ # Read the file
open(my $fh, '<', $qfn)
or die "Can't open \"$qfn\": $!\n";
local $/;
$file = <$fh>;
}
# Change the file
$file =~ s/^(.*)\n/<$1>\n/mg;
{ # Save the changes
open(my $fh, '>', $qfn)
or die "Can't create \"$qfn\": $!\n";
print($fh $file);
}
如果您想使用磁盘:
rename($qfn, "$qfn.old")
or die "Can't rename \"$qfn\": $!\n";
open(my $fh_in, '<', "$qfn.old")
or die "Can't open \"$qfn\": $!\n";
open(my $fh_out, '>', $qfn)
or die "Can't create \"$qfn\": $!\n";
while (<$fh_in>) {
chomp;
$_ = "<$_>";
print($fh_out "$_\n");
}
unlink("$qfn.old");
使用一个技巧,上面的内容可以简化为
local @ARGV = $qfn;
local $^I = '';
while (<>) {
chomp;
$_ = "<$_>";
print(ARGV "$_\n");
}
或者作为一句单行:
perl -i -pe'$_ = "<$_>"' file