perl调试器将STDIN视为调试器命令,而不是STDIN

时间:2015-01-26 16:19:02

标签: perl debugging input stdin

在我的perl脚本中,我通过以下构造阅读用户输入:

# 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", $_; 
    }
}

因此,当我运行脚本时,我能够粘贴(或键入)多行行(输入分隔的)字符串,然后再次按回车键并点击ctrl+d以表示用户输入的结束并且它可以正常工作。 / p>

现在我需要调试这个脚本

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阅读过程。 我还发现there are有几种伪造STDIN的方法,但不幸的是我对它们的语法有点混淆,不知道如何使用它们。

1 个答案:

答案 0 :(得分:3)

Perl调试器将从终端获取输入。如果您正在调试的程序正在读取STDIN ,那么您的程序继承了终端,因为它处于STDIN状态,那么您将处于您所处的状态。

您有三种选择可以继续阅读<>

  • 从其他来源重定向STDIN:perl -d myprog.pl < mystdin.txtprogram_that_generates_usefull_input | perl -d myprog.pl

  • 利用<>从ARGV中指定的STDIN 文件中读取的事实:perl -d myprog.pl myargv1.txt myargv2.txt

  • 非常密切注意要求输入的程序。

    在上面的示例中,您s查看请求输入的while行;在正在调试的程序中输入文本input1;然后,当调试器询问如何处理第一个替换行时,您忽略调试器,希望暂停的程序当前可能接受更多文本。