在Perl中,我试图逐行读取文件并处理每一行,并根据需要进行修改.到目前为止,我正在阅读的唯一方法是将文件读入数组,根据需要修改数组的每个元素,然后在完成后将其输出回文件.
有没有更好的方法来做到这一点,也许某种方式我可以替换单行,因为我一起去?
现在,我的处理代码如下所示:
while (my $line = <FILE>)
{
# process line here
# ...........
print FILE $line;
}
Run Code Online (Sandbox Code Playgroud)
我的代码似乎非常接近,除了它在我当前所在的行之后替换一行,所以看起来如果我可以将文件指针向上移一行,它会写入文件中的正确位置.
我是在正确的轨道上吗?从这里我需要做什么来备份文件指针,以便写入我正在阅读的同一行?
编辑:
在我收到的答案中,使用local $^I和Tie::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)
从这里我需要做什么来备份文件指针,以便写入我正在阅读的同一行?
这没有用,除非您打算写的每行与您要替换的行的长度相同(在这种情况下,您正在寻找的工具是寻找和告诉).但是对于普通编辑,标准文件模型不会因为原位替换而削减它.
幸运的是,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)
| 归档时间: |
|
| 查看次数: |
17399 次 |
| 最近记录: |