принять ввод массива от пользователя в 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 ответ:
Основная проблема здесь заключается в том, что вы используете
@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;
Эти две прагмы имеют короткую кривую обучения, но кодирование без них это сложно и опасно.