2015-01-26 4 views
1

В моем PERL скрипта Читает ввод данных пользователя с помощью следующей конструкции:Perl отладчик обрабатывает STDIN как отладчик команд не как STDIN

# READ INPUT IN TO THE ARRAY, LINE BY LINE AND REMOVE SLASHES /, BLANK CHARACTERS, EMPTY LINES, AND NEWLINES 
while (<>) { 
    $_ =~ s/\\//g;   # Remove slash/
    $_ =~ s/^\s+|\s+$//g;  # Remove heading and trailing white spaces 
    $_ =~ s/^\s*$//g;   # Remove white spaces 
    $_ =~ s/\r|\n//g;   # Remove CR and NL 
    if ($_ !~ /^\s*$/ && 
     $_ !~ /:/  && 
     ($_ =~ /^[^=#]+=[^=#]+$/ || $_ =~ /^#+$/)){ 
     push @raw_admin_input, split "\n", $_; 
    } 
} 

Так что, когда я запускаю сценарий, я могу вставить (или типа) мульти -line line (введите разделенную), затем нажмите Enter еще раз и нажмите ctrl+d, чтобы сигнализировать о конце ввода пользователя, и он работает.

Теперь мне нужно отладить этот скрипт

main::(stdin.pl:177):  while (<>) { # READ INPUT IN TO THE ARRAY, LINE BY LINE AND REMOVE SLASHES /, BLANK CHARACTERS, EMPTY LINES, AND NEWLINES 
    DB<4> s 
input1 
main::(skript12.pl:179):   $_ =~ s/\\//g;   # Remove slash/
    DB<4> input2 

    DB<5> input3 

    DB<6> ############# 

    DB<7> sdasda=asdasd 
Can't modify constant item in scalar assignment at (eval 13)[/usr/share/perl5/core_perl/perl5db.pl:732] line 2, at EOF 

Проблема заключается в том, что Perl отладчик распознает это как команды для отладчика, а не в качестве вклада STDIN. Я уверен, что это сработало раньше, и я не знаю, что я изменил упомянутый процесс чтения STDIN. Я также нашел, что thereare несколько способов подделать STDIN, но, к сожалению, я немного смущен их синтаксисом и не знаю, как их использовать.

+2

Подайте свой сценарий из файла вместо клавиатуры. –

+0

Можете ли вы уточнить, как это сделать? –

+3

'perl -d myprog.pl tjd

ответ

3

Отладчик Perl будет принимать входные данные от терминала. . Если программа отладка читает STDIN и программы унаследовала терминал, как это STDIN, то вы будете в ситуации вы находитесь в

У вас есть три варианта, которые позволяют поддерживать чтение из <>:

  • перенаправление STDIN из другого источника: perl -d myprog.pl < mystdin.txt или program_that_generates_usefull_input | perl -d myprog.pl

  • Воспользуйтесь тем, что <> читает из STDIN или файлы, названные в ARGV: perl -d myprog.pl myargv1.txt myargv2.txt

  • Pay очень пристальное внимание, к которому программа просит ввода.

    В приведенном выше примере вы s tep через линию ввода while; Вы вводите текст input1 в отлаживаемую программу; то, пока отладчик спрашивает, что делать с первой строкой подстановки, вы игнорируете отладчик, надеясь, что приостановленная программа может в настоящее время принимать больше текста.

+0

Любая идея, почему это работало? Раньше я только что вставил вклад, поскольку это под вопросом, и это сработало, теперь это не так, и я не знаю, почему. Также, если скрипт perl ожидает ввода несколько раз, как справиться с этой проблемой? –

+0

Редактировать, чтобы решить ваши проблемы. Также обратите внимание: текстовые файлы, содержащие ввод, могут быть длиннее одной строки. – tjd