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

pka*_*ala 4 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");
}
Run Code Online (Sandbox Code Playgroud)

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

Сух*_*й27 5

尝试,

my $continue = <STDIN>;
Run Code Online (Sandbox Code Playgroud)

代替

my $continue = <>;
Run Code Online (Sandbox Code Playgroud)

如同<>魔法一样打开-文件句柄,并且不会在稍后查看内容@ARGV,因此不处理您的文件.


Lee*_*hem 5

根据perlop:

来自<>的输入来自标准输入,或来自命令行中列出的每个文件.以下是它的工作原理:第一次计算 <>时,检查@ARGV数组,如果它是空的,则将$ ARGV [0]设置为" - ",打开时会给出标准输入.然后将@ARGV数组作为文件名列表处理.

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