我试图在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 第一个<>只要数组最终包含您真正想要的文件名列表。