簡體   English   中英

如果我在此之前讀取用戶輸入,為什么perl inplace編輯工作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM