4

我正在尝试在 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 或使用临时文件并重命名它来解决这个问题,但我想知道这种行为的原因以及执行此操作的正确方法。

4

2 回答 2

5

尝试,

my $continue = <STDIN>;

代替

my $continue = <>;

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

于 2014-05-09T08:18:43.500 回答
5

根据perlop

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

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

于 2014-05-09T08:19:53.293 回答