我有一个文件,d00.dat,我需要更改d02的字符串d01 ...使用以下代码,它会在控制台中打印修改但它们在文件d00.dat中不会更改...我怎么能这样做?
my $line = 0;
my $filename = "d00.dat";
open(my $fh, '<', $filename) || die "file could not open $! \n";
while( $line = <$fh>) {
if( $line =~ s/d01/d02/g ){
print "$line\n";
}
答案 0 :(得分:1)
最简单,最快速的解决方案是将文件读入内存,进行更改,然后将更改写回文件。
my $qfn = "d00.dat";
my $file;
{
open(my $fh, '<', $qfn)
or die("Can't open \"$qfn\": $!\n");
local $/;
$file = <$fh>;
}
$file =~ s/d01/d02/g;
{
open(my $fh, '>', $qfn)
or die("Can't create \"$qfn\": $!\n");
print($fh $file);
}
作为一个单行:
perl -i -pe's/d01/d02/g' d00.dat
答案 1 :(得分:0)
Perl有一个可以就地修改文件的开关。我认为这就是你要找的东西:
perl -i.bak -p -e 's/d01/d02/g;' d00.dat
这将
d00.dat
重命名为d00.dat.bak
d00.dat.bak
d01
d02
的每一次出现
d00.dat
说明:
-i
就地编辑文件,并且如果给出了一些后缀,则可以选择进行备份。
例如。 -i.bak
将创建$file.bak
,-i.before
将创建$file.before
等。
如果没有后缀(仅-i
),则无备份,请考虑这种危险。
-p
放置一个类似
while(<>) {
# your code
print;
}
在这种情况下 s/…/…/g;
)
-e
仅表示&#34;执行以下语句&#34; 。
答案 2 :(得分:0)
如果您正考虑更改这些地方,则无法更换整个文件。
您可以将每行(包括更改)打印到另一个文件,然后将其复制。或者,您可以读取所有行,根据需要更改它们,然后覆盖该文件。
my $filename = "d00.dat";
open(my $fh, '<', $filename) || die "file could not open $! \n";
my @new_lines = map { s/d01/d02/g; $_ } <$fh>;
close $fh;
open(my $fh_out, '>', $filename) || die "file could not open $! \n";
print $fh_out $_ for @new_lines;
由于open
已关闭文件句柄(如果已经打开),您也可以执行
open(my $fh, '<', $filename) || die "file could not open $! \n";
my @new_lines = map { s/d01/d02/g; $_ } <$fh>;
open($fh, '>', $filename) || die "file could not open $! \n";
print $fh $_ for @new_lines;