принять ввод массива от пользователя в Perl


Когда я использую этот код

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

Он продолжает принимать ввод от пользователя, пока я не использую ctrl+z, а затем нажимаю enter. Я хочу ограничить количество вводимых пользователем данных в список. Для этого я старался

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

Но это старение попадает в бесконечный цикл, и я должен использовать ctrl+c

Как я могу ограничить свой цикл так, что только 10 пользователей ввода будут вводить

1 6

1 ответ:

Основная проблема здесь заключается в том, что вы используете @arr[$i], Когда вы должны использовать $arr[$i]. Используя сигиллу массива @, вы применяете контекст списка к дескриптору файла, что позволяет ему считывать как можно больше значений. В скалярном контексте он просто считывает одно значение, а затем переходит к следующей итерации. Другими словами, это должно быть так:

$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;

Эти две прагмы имеют короткую кривую обучения, но кодирование без них это сложно и опасно.