2014-05-09 3 views
4

Я пытаюсь редактировать файл cfg внутри внутри perl-скрипта, но он не работает, если я прочитал ввод данных до этого. Вот тестовый сценарий, чтобы воссоздать проблему, которую я вижу.Почему не работает perl inplace, если я читаю пользовательский ввод до этого?

#!/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"); 
} 

Редактирование работает, если я закомментировать "мои $ продолжить = <>;" линия. Если я прочитаю ввод пользователя, похоже, что настройка @ARGV для файла trace.cfg не вступает в силу, а цикл while ожидает ввода от STDIN. Я могу обойти это, используя sed или используя временный файл и переименовав его, но я хотел бы знать причину такого поведения и правильный способ сделать это.

+0

Я никогда не осознавал этого. «Аккуратный». – ikegami

ответ

5

Try,

my $continue = <STDIN>; 

вместо

my $continue = <>; 

в <> есть магия, которая открывает - дескриптор файла, а не смотреть позже на том, что в @ARGV, таким образом, не обрабатывает файлы.

5

По perlop:

Входной сигнал от <> поставляется либо со стандартного ввода, или из каждого файла, указанного в командной строке. Вот как это работает: первый раз <> оценивается, массив @ARGV проверен, и если он пуст, $ ARGV [0] установлен на «-», который при открытии дает вам стандартный ввод. Затем массив @ARGV обрабатывается как список имен файлов.

Вы можете изменить @ARGV до первых <> до тех пор, пока массив не будет содержать список имен файлов, которые вы действительно хотите.