如何根据需要修改行时逐行读取文件?

Fra*_*wis 1 perl

在Perl中,我试图逐行读取文件并处理每一行,并根据需要进行修改.到目前为止,我正在阅读的唯一方法是将文件读入数组,根据需要修改数组的每个元素,然后在完成后将其输出回文件.

有没有更好的方法来做到这一点,也许某种方式我可以替换单行,因为我一起去?

现在,我的处理代码如下所示:

while (my $line = <FILE>)
{
    # process line here
    # ...........

    print FILE $line;
}
Run Code Online (Sandbox Code Playgroud)

我的代码似乎非常接近,除了它在我当前所在的行之后替换一行,所以看起来如果我可以将文件指针向上移一行,它会写入文件中的正确位置.

我是在正确的轨道上吗?从这里我需要做什么来备份文件指针,以便写入我正在阅读的同一行?


编辑:

在我收到的答案中,使用local $^ITie::File工作都很好.我结束了,Tie::File所以我不必打印出文件的每一行.这样,如果在脚本中途发生了某些事情,我的文件就不会搞砸了.

我的新代码如下所示:

use Tie::File;

chomp(my $filename = $ARGV[0]);
tie my @array, 'Tie::File', $filename or die $!;

foreach my $line(@array)
{
    # ...... line processing happens here .......
    # ...... $line is automatically written to file if $line is changed .......
}
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 7

从这里我需要做什么来备份文件指针,以便写入我正在阅读的同一行?

这没有用,除非您打算写的每行与您要替换的行的长度相同(在这种情况下,您正在寻找的工具是寻找告诉).但是对于普通编辑,标准文件模型不会因为原位替换而削减它.

幸运的是,Perl提供了一个功能,可以轻松实现所需的功能,称为"就地编辑模式",其中源文件可以重命名或取消链接,输出定向到具有相同名称的新文件.大多数情况下它的使用通过使-i 命令行开关与一起-p-n开关线路明智的编辑,但你也可以使用一个程序中启用它$^I 特殊的变量.

示例代码:

{   # Create a scope to localize variables in.
    # If you want to back up the originals, set $^I to ".bak" instead.
    local $^I = "";
    # Set @ARGV to the file you want to process, or a list of files.
    local @ARGV = ("file.txt");

    while (my $line = <>) {
        # Process $line here.
        print $line;
    }
}
Run Code Online (Sandbox Code Playgroud)


mus*_*iKk 5

我不认为从文件中读取并同时写入它是一个好主意.

你可以用Tie::File.它将文件的行绑定到数组.您可以根据需要修改数组,然后在后台透明地修改文件.