如果我在此之前读取用户输入,为什么perl inplace编辑工作?

时间:2014-05-09 07:56:08

标签: perl inplace-editing

我正在尝试在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 =&lt;&gt ;;”,编辑就有效。线。如果我确实读取了用户输入,看起来设置@ARGV到trace.cfg文件没有生效,而while循环等待来自STDIN的输入。我可以通过使用sed或使用临时文件并重命名来解决这个问题,但我想知道这种行为的原因以及正确的方法。

2 个答案:

答案 0 :(得分:5)

尝试,

my $continue = <STDIN>;

而不是

my $continue = <>;

因为<>具有开启-文件句柄的魔力,并且稍后不会查看@ARGV中的内容,因此无法处理您的文件。

答案 1 :(得分:5)

根据perlop

  

来自&lt;&gt;的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次&lt;&gt;如果进行评估,则检查@ARGV数组,如果为空,则将$ ARGV [0]设置为“ - ”,打开时会为您提供标准输入。然后将@ARGV数组作为文件名列表处理。

     

你可以修改@ARGV 之前第一个&lt;&gt;只要数组最终包含你真正想要的文件名列表。