当我想在Perl中从键盘读取数据时,我使用下面的代码,但它会一直等待数据。
哪个字符会通知程序用户已完成输入?
@array = <STDIN>;
$Size = @array;
for ( $i = 0; $i < $size; $i++ ) {
print "$i"."$array[$i]";
}
注意:有时当我使用Ctrl-Z时,它会显示正确的结果,但这不会一直有效。我正在使用带有Perl插件的Eclipse IDE。
答案 0 :(得分:5)
perldoc -f readline
表示在列表上下文中,readline
(您正在使用的<>
运算符)读取,直到到达文件结尾并返回行列表。
您是否正在使用像bash这样的shell运行程序?如果是这种情况,那么文件结尾字符是Ctrl-D(按住 CTRL 并按 D )。
答案 1 :(得分:2)
在每个shell中,EOF
必须是响应readline
的第一个字符。因此,用户必须键入 CTRL-Z (DOS / Windows shell)或 CTRL-D (* nixy shells)作为终止输入的行中的第一个字符
这是因为您正在使用一种通过执行@array = <STDIN>
从标准输入读取的slurpy方法。这意味着您的程序将尝试从标准输入读取行,直到输入用完为止。您的程序依赖shell /终端来确定输入何时耗尽(我忽略了文件重定向)。
$ ./myprog some input⏎ some more input⏎ CTRL-D
会奏效。另一方面,
$ ./myprog some input⏎ some more inputCTRL-D
不会。在这种情况下,按两次 CTRL-D 可能足以终止输入。但是,在DOS / Windows shell中,多次按 CTRL-Z 不会产生这种效果。
如果您逐行切换到<STDIN>
读取,您的程序可以响应输入的每一行而不必等待读取所有行。 E.g:
#!/usr/bin/env perl
use strict;
use warnings;
my @input;
while (my $line = <STDIN>) {
last if $line !~ /\S/; # stop reading if input is all whitespace
push @input, $line;
}
for my $line ( @input ) {
print $line;
}