当我使用此代码时
print "\nEnter !0 numbers \n\n";
@arr=<STDIN>;
chomp @arr;
Run Code Online (Sandbox Code Playgroud)
它继续从用户ctrl+z输入,直到我使用,然后按Enter键.我想限制用户输入到列表的数量.为此,我试过了
print "\nEnter !0 numbers \n\n";
for($i=0;$i<10;$i++)
{
@arr[$i]=<STDIN>;
chomp @arr;
}
Run Code Online (Sandbox Code Playgroud)
但是这种老化陷入了无限循环,我不得不使用 ctrl+c
我如何限制我的循环,以便只输入10个输入用户
TLP*_*TLP 10
这里的基本问题是你在使用@arr[$i]时正在使用$arr[$i].使用数组sigil @,您可以在文件句柄上强制执行列表上下文,从而使其尽可能多地读取值.在标量上下文中,它只读取一个值,然后转到下一个迭代.换句话说,它应该是这样的:
$arr[$i] = <STDIN>;
Run Code Online (Sandbox Code Playgroud)
但是,关于您的代码,可以说更多.例如,在分配数字时使用特定索引是非常必要的,您可以简单地使用push
for (1 .. 10) {
my $num = <STDIN>;
chomp $num;
push @arr, $num;
}
Run Code Online (Sandbox Code Playgroud)
小心确保保持标量上下文.从技术上讲,您可以这样做push @arr, <STDIN>,但这会将文件句柄再次放入列表上下文中.这种方式也很好听.
另一种在不使用"外部"计数器的情况下执行相同操作的方法是将数组本身用作循环条件.在标量上下文中,数组返回其大小.我们可以while像这样使用它:
while (@arr < 10) {
my $num = <STDIN>;
chomp $num;
push @arr, $num;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你为你的计数设置一个变量......
my @arr;
my $count = 10;
print "Enter $count numbers: ";
while (@arr < $count) {
Run Code Online (Sandbox Code Playgroud)
...你的程序现在可以扩展.
大多数情况下,不需要或不需要使用STDIN.例如,您可能希望程序也使用文件名作为输入.使用"菱形运算符" <>允许Perl自行决定是否从<ARGV>或读取<STDIN>.所以,你可以改为使用:
my $num = <>;
Run Code Online (Sandbox Code Playgroud)
你应该经常使用
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
这两个pragma有一个很短的学习曲线,但没有它们的编码是困难和危险的.