perl – 读取整个文件,然后在内部编辑时打印?

perl – 读取整个文件,然后在内部编辑时打印?,第1张

概述大多数就地编辑的例子都是单行,它们遍历一个或多个文件,一次读取和打印一行. 我找不到任何将整个文件读入数组,根据需要修改数组,然后在使用^ I开关进行就地编辑时打印数组的示例.当我尝试从钻石运算符读取整个文件,编辑内容并打印整个内容时,我发现打印转到STDOUT而不是ARGVOUT并且ARGVOUT已关闭.我可以打开相同的文件输出然后打印到它,但我不确定我理解为什么这是必要的.这是一个例子: #! 大多数就地编辑的例子都是单行,它们遍历一个或多个文件,一次读取和打印一行.

我找不到任何将整个文件读入数组,根据需要修改数组,然后在使用^ I开关进行就地编辑时打印数组的示例.当我尝试从钻石运算符读取整个文件,编辑内容并打印整个内容时,我发现打印转到STDOUT而不是ARGVOUT并且ARGVOUT已关闭.我可以打开相同的文件输出然后打印到它,但我不确定我理解为什么这是必要的.这是一个例子:

#!/usr/bin/perluse strict;use warnings;use 5.010;my $filename = 'test.txt';push @ARGV,$filename;$^I = ".bk";my @file = <>; #Read all records into arraychomp @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.

解决方法 见 perlrun.

当调用-i开关时,perl使用ARGVOUT作为默认文件句柄而不是STDOUT来启动程序.如果有多个输入文件,那么每次<>或< ARGV>或readline(ARGV) *** 作完成其中一个输入文件,它关闭ARGVOUT并重新打开它以写入下一个输出文件名.

一旦来自<>的所有输入耗尽(当没有更多文件要处理时),perl关闭ARGVOUT并再次将STDOUT恢复为默认文件句柄.或者正如perlrun所说

#!/usr/bin/perl -pi.origs/foo/bar/;

相当于

#!/usr/bin/perl$extension = '.orig';liNE: while (<>) {    if ($ARGV ne $oldargv) {        if ($extension !~ /\*/) {            $backup = $ARGV . $extension;        }        else {            ($backup = $extension) =~ s/\*/$ARGV/g;        }        rename($ARGV,$backup);        open(ARGVOUT,">$ARGV");        select(ARGVOUT);        $oldargv = $ARGV;    }    s/foo/bar/;}continue {    print;  # this prints to original filename}select(STDOUT);

一旦你说我的@file =<>并消耗所有输入,Perl将文件句柄关闭到备份文件并开始再次将输出定向到STDOUT.

我认为,解决方法是调用<>在标量上下文中并在每行之后检查eof(ARGV).当eof(ARGV)= 1时,您已阅读该文件中的最后一行,并且在调用<>之前您有一次机会打印再次:

my @file = ();while (<>) {    push @file,$_;    if (eof(ARGV)) {        # done reading current file        @processed_file = &do_something_with(@file);        # last chance to print before ARGVOUT gets reset        print @processed_file;        @file = ();    }}
总结

以上是内存溢出为你收集整理的perl – 读取整个文件,然后在内部编辑时打印?全部内容,希望文章能够帮你解决perl – 读取整个文件,然后在内部编辑时打印?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1266566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存