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