我正在尝试在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或使用临时文件并重命名来解决这个问题,但我想知道这种行为的原因以及正确的方法。
答案 0 :(得分:5)
尝试,
my $continue = <STDIN>;
而不是
my $continue = <>;
因为<>
具有开启-
文件句柄的魔力,并且稍后不会查看@ARGV
中的内容,因此无法处理您的文件。
答案 1 :(得分:5)
根据perlop
:
来自&lt;&gt;的输入来自标准输入,或来自命令行中列出的每个文件。以下是它的工作原理:第一次&lt;&gt;如果进行评估,则检查@ARGV数组,如果为空,则将$ ARGV [0]设置为“ - ”,打开时会为您提供标准输入。然后将@ARGV数组作为文件名列表处理。
你可以修改@ARGV 之前第一个&lt;&gt;只要数组最终包含你真正想要的文件名列表。