什么是行结束字符停止从键盘读取数据到数组?

时间:2016-05-14 06:38:28

标签: arrays perl

当我想在Perl中从键盘读取数据时,我使用下面的代码,但它会一直等待数据。

哪个字符会通知程序用户已完成输入?

程序

@array = <STDIN>;
$Size = @array;

for ( $i = 0; $i < $size; $i++ ) {
   print "$i"."$array[$i]";
}

注意:有时当我使用Ctrl-Z时,它会显示正确的结果,但这不会一直有效。我正在使用带有Perl插件的Eclipse IDE。

2 个答案:

答案 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;
}