perl 调试器将 STDIN 视为调试器命令而不是 STDIN
perl debugger treats STDIN as a debugger commands not as 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
以表示用户结束输入并且有效。
现在我需要调试这个脚本
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 的方法,但不幸的是,我对它们的语法有点困惑,不知道如何使用它们。
Perl 调试器将从终端获取输入。如果您正在调试的程序正在读取 STDIN 并且 您的程序继承了 Terminal 因为它是 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
非常密切注意哪个程序要求输入。
在上面的示例中,您 s
逐步执行 while
行请求输入;你在被调试的程序中输入文本input1
;然后当调试器询问如何处理第一个替换行时,您忽略调试器希望暂停的程序当前可能正在接受更多文本。
在我的 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
以表示用户结束输入并且有效。
现在我需要调试这个脚本
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 的方法,但不幸的是,我对它们的语法有点困惑,不知道如何使用它们。
Perl 调试器将从终端获取输入。如果您正在调试的程序正在读取 STDIN 并且 您的程序继承了 Terminal 因为它是 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
非常密切注意哪个程序要求输入。
在上面的示例中,您
s
逐步执行while
行请求输入;你在被调试的程序中输入文本input1
;然后当调试器询问如何处理第一个替换行时,您忽略调试器希望暂停的程序当前可能正在接受更多文本。