[英]Why doesn't perl inplace editing work if I read user input before that?
我正在嘗試在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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.