我想替换文件中的文本并覆盖文件。
use strict;
use warnings;
my ($str1, $str2, $i, $all_line);
$str1 = "AAA";
$str2 = "bbb";
open(RP, "+>", "testfile") ;
$all_line = $_;
$i = 0;
while(<RP>) {
while(/$str1/) {
$i++;
}
s/$str1/$str2/g;
print RP $_;
}
close(RP);
Run Code Online (Sandbox Code Playgroud)
正常的过程是逐行读取文件并将每行(根据需要/如果需要更改)写入新文件。全部完成后,尽可能自动地重命名该新文件,以便覆盖原始文件。
这是一个为我们完成所有这些操作的库的示例,Path::Tiny
use warnings;
use strict;
use feature 'say';
use Path::Tiny;
my $file = shift || die "Usage: $0 file\n";
say "File to process:";
say path($file)->slurp;
# NOTE: This CHANGES THE INPUT FILE
#
# Process each line: upper-case a letter after .
path($file)->edit_lines( sub { s/\.\s+\K([a-z])/\U$1/g } );
say "File now:";
say path($file)->slurp;
Run Code Online (Sandbox Code Playgroud)
在找到该字母的每一行上,将点(句点)后面的字母、一些空格之后的字母大写,并原封不动地复制所有其他行。(这只是一个例子,不是正确的语言修复。)
注意:输入文件是就地编辑的,因此完成后它将被更改。
此功能是在 2016 年 2 月 10 日的模块版本 0.077中引入的。(作为参考,Perl 版本 5.24 于 2016 年 8 月发布。因此,对于 Perl 5.24 或更高版本的系统,Path::Tiny从操作系统包安装或作为默认 CPAN 版本安装应该具有此方法。)