gpt4 book ai didi

perl - 打开文件并通过调整覆盖该文件且不进行备份

转载 作者:行者123 更新时间:2023-12-02 18:05:26 26 4
gpt4 key购买 nike

我有以下三行:

rename($file_path, $file_fh.'.bak');
open( my $file_IN_fh, '<' , $file_path.'.bak') || die "die message";
open( my $file_OUT_fh, '>' , $file_path) || die "die message";

效果很好。它允许我浏览文件 while(<$file_IN_fh>) ,使用脚本进行一系列更改( s///gif() 以确定该行是否保留等),然后写入输出文件。最后,我得到了编辑后的文件,并且文件名未更改

我的问题是,我现在不再需要备份文件,所以我想用类似的不会创建备份文件的代码替换代码,并来回评论这三个文件如果我的需求发生变化,多年来都会排队。

如何就地而不是从命令行进行这种编辑?

最佳答案

一种基本方法是逐行读取文件并将所需的输出行写入临时文件,然后将其重命名以覆盖原始文件。

use File::Copy qw(move);

open my $fh, '<', $file or die "Can't open $file: $!";
open my $fh_out, '>', $outfile or die "Can't open $outfile: $!";

while (<$fh>) {
next if /line_to_skip/;
s/patt/repl/g;
print $fh_out $_;
}
close $_ for ($fh, $fh_out);

move ($outfile, $file) or die "Can't move $outfile to $file: $!";

这通常是由“就地”编辑文件的工具完成的(具有额外的安全性、检查和灵 active )。由于 $outfile 是临时使用 File::Temp 。当 close 时添加检查-ing 文件。请注意,这会更改文件的 inode 号,这对于某些应用程序可能很重要。

如果文件不大,您可以简化并先读取它

open my $fh, '<', $file or die "Can't open $file: $!";

my @lines = <$fh>;

open $fh, '>', $file or die "Can't open $file for writing: $!";

for (@lines) {
next if /line_to_skip/;
s/patt/repl/g;
print $fh_out $_;
}

close $fh;

什么会保留 inode 编号,因为 > 模式会截断现有的 inode 数据。

<小时/>

如果这确实是一个问题,您仍然可以保留相同的 inode。临时文件写入后,打开它进行读取,打开原始文件进行写入;截断该 inode 的内容。然后将临时文件复制到原始文件中。关闭句柄并删除临时文件。

关于perl - 打开文件并通过调整覆盖该文件且不进行备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51660007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com