从Perl中的用户获取数组输入

时间:2013-09-24 10:25:13

标签: perl

当我使用此代码时

print "\nEnter !0 numbers \n\n";
@arr=<STDIN>;
chomp @arr;

继续从用户那里获取输入,直到我使用ctrl+z,然后按回车键。我想限制用户输入到列表的数量。 为此,我试过了

print "\nEnter !0 numbers \n\n";
for($i=0;$i<10;$i++)
{
@arr[$i]=<STDIN>;
chomp @arr;
} 

但是这种老化会陷入无限循环,我必须使用ctrl+c

如何限制循环以便只输入10个输入用户

1 个答案:

答案 0 :(得分:10)

此处的基本问题是,当您使用@arr[$i]时,您正在使用$arr[$i]。使用数组sigil @,可以在文件句柄上强制执行列表上下文,从而使其尽可能多地读取值。在标量上下文中,它只读取一个值,然后转到下一个迭代。换句话说,它应该是这样的:

$arr[$i] = <STDIN>;

但是,关于您的代码可以说更多。例如,在分配数字时使用特定索引是非常必要的,您只需使用push

for (1 .. 10) {
    my $num = <STDIN>;
    chomp $num;
    push @arr, $num;
}

小心确保保持标量上下文。从技术上讲,您可以执行push @arr, <STDIN>,但这会将文件句柄再次放入列表上下文中。这种方式也很好,也是可读的。

另一种在不使用“外部”计数器的情况下执行相同操作的方法是使用数组本身作为循环条件。在标量上下文中,数组返回其大小。我们可以像while一样使用它:

while (@arr < 10) {
    my $num = <STDIN>;
    chomp $num;
    push @arr, $num;
}

现在,如果你为你的计数设置一个变量......

my @arr;
my $count = 10;
print "Enter $count numbers: ";
while (@arr < $count) {

...您的程序现在可以扩展。

大多数情况下,不需要或不需要使用STDIN。例如,您可能希望程序也使用文件名作为输入。使用“菱形运算符”<>可让Perl自行决定是从<ARGV>还是<STDIN>进行阅读。所以,你可以改用:

my $num = <>;

你应该总是使用

use strict;
use warnings;

这两个pragma有一个很短的学习曲线,但没有它们的编码是困难和危险的。