如果我在此之前读取用户输入,为什么 perl 就地编辑不起作用?



我试图在perl脚本中编辑一个cfg文件,但如果我在此之前读取用户输入,它就不起作用了。下面是一个测试脚本来重现我所看到的问题。

#!/usr/bin/perl -w
use strict;
my $TRACE_CFG = "trace.cfg";
print "Continue [y/N]> ";
my $continue = <>;
{
    local $^I = '.bak';
    local @ARGV = ($TRACE_CFG);
    while (<>) {
        s/search/replace/;
        print;
    }
    unlink("$TRACE_CFG.bak");
}

如果我注释掉"my $continue = <>;"行,编辑就可以工作了。如果我确实读取用户输入,看起来将@ARGV设置为trace.cfg文件不会生效,while循环等待来自STDIN的输入。我可以通过使用sed或使用临时文件并重命名它来解决这个问题,但我想知道这种行为的原因和正确的方法。

试试,

my $continue = <STDIN>;
不是

my $continue = <>;

作为<>具有打开-文件句柄的魔力,并且不查看@ARGV中的内容,因此不处理您的文件。

根据perlop:

输入自<>可以来自标准输入,也可以来自命令行中列出的每个文件。下面是它的工作原理:第一次 <>被求值,@ARGV数组被检查,如果它是空的,$ARGV[0]被设置为"-",打开后给出标准输入。@ARGV数组然后作为文件名列表处理。

可以在前面修改@ARGV 第一个<>只要数组最终包含您真正想要的文件名列表。

相关内容

  • 没有找到相关文章

最新更新