【发布时间】:2011-02-02 21:04:27
【问题描述】:
就地编辑的大多数示例都是单行代码,它遍历一个或多个文件,一次读取和打印一行。
我找不到任何将整个文件读入数组、根据需要修改数组、然后在使用 ^I 开关进行就地编辑时打印数组的示例。当我尝试从菱形运算符读取整个文件、编辑内容并打印整个内容时,我发现打印到 STDOUT 而不是 ARGVOUT 并且 ARGVOUT 已关闭。我可以打开相同的文件进行输出,然后打印到它,但我不确定我是否理解为什么这是必要的。这是一个例子:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my $filename = 'test.txt';
push @ARGV, $filename;
$^I = ".bk";
my @file = <>; #Read all records into array
chomp @file;
push @file, qw(add a few more lines);
print join "\n", @file; #This prints to STDOUT, and ARGVOUT is closed. Why?
运行上述命令会按预期备份 test.txt 文件,但会将编辑后的 test.txt 保留为空,而是将编辑后的内容打印到 STDOUT。
【问题讨论】:
-
找不到任何示例的原因是因为在 Perl 中通常认为读取整个文件而只进行逐行处理是不好的做法。 :) 有很多更好的方法来处理阅读。请参阅下面的答案,了解一些具体原因。
-
对不起@Robert P,但有许多行处理任务最容易首先加载所有行。如果要删除文件正中间的行怎么办?删除包含 700 到 750 行之间的模式的行在包含另一个模式的行之前?排序后处理输入,然后在打印前删除顶部和/或底部的一些行?
-
很好的答案。 @mob's 和 @ephemient's 都完全按照我的意愿行事,所以真的是折腾,可以接受。
-
@mob:就像我说的,一般最好在 Perl 中逐行处理。我没有说它不能,或者根本不应该做(虽然,如果你有第二个读取文件 hanlde,你建议的前两个任务仍然可以通过逐行处理来处理!): -)
标签: perl inplace-editing