2015-04-04 4 views
0

Как принять список целых чисел в качестве входных данных? Единственное, что я могу придумать, - это получить все целые числа из списка, используя STDIN. Есть лучший способ сделать это?Принимать пользовательский ввод perl

+0

Вам нужно будет объяснить, в чем проблема с чтением из дескриптора файла, поскольку нет другого способа получить данные в программу, и трудно угадать, что может быть лучшим способом *. – Borodin

+1

Существует много способов принятия входных данных. Какой из них вы хотите использовать? – ikegami

ответ

-1

Вот один подход, принимая разделенный запятыми список целых чисел:

my $input = <STDIN>; 
chomp($input); 
if ($input !~ m/^(\d+(,\d+)*)?$/) { die('invalid input'); } 
my @input = split(/,/, $input); 

Или вы можете прочитать одно целое число в каждой строке:

my @input; 
while (my $input = <STDIN>) { 
    chomp($input); 
    if ($input !~ m/^\d+$/) { die('invalid input'); } 
    push(@input, $input); 
} ## end while 
+0

Если вам нужна одна строка 'if', используйте обратную сторону:' die qq (Invalid input), если $ input! ~/^ \ D + $/'. –

0

Это, как я это сделал:

$input = 0; 
while($input != -1) 
{ 
    print "add input, finish with -1", "\n"; 
    $input = <STDIN>; 
    chomp($input); 
    push(@array, $input); 
} 
#You also need to remove the last input, -1, with pop: 
pop(@array); 
print @array; 

Консольный выход:

add input, finish with -1 
1 
add input, finish with -1 
2 
add input, finish with -1 
-1 
12 

Если пользователь вводит строку цифр с разделителями табуляции напрямую, вы можете использовать функцию сращивания для разделения строк.

@array = splice(/\t/,$array[0]) 
+0

Когда вы показываете код или вывод, отступайте строки на четыре пробела, чтобы он отображался как программа. Вы можете увидеть, как я это сделал, нажав «edit» выше. –

+0

Вы никогда не проверяли свой ввод, который может быть проблемой, если вы вводите нецелые числа. Вы также никогда не расписываете свой ввод, поэтому каждый из них находится на отдельной строке. У вас есть скрытая _ новая строка в конце каждого номера. –

+0

Спасибо, Дэвид. Также -1 должен быть удален с поп-музыкой. Плохое редактирование! –

0

Вы хотите ввести список целых чисел? Я так понимаю, вы хотите ввести список чисел и принять этот ввод, если они все целые.

В этой программе я цикл навсегда, пока не получу действительный список, таким образом, for (;;). Некоторые люди предпочитают while (1).

Я использую looks_like_number, чтобы проверить, является ли ввод числовым, а затем используйте int, чтобы убедиться, что это число является целым числом. Вы можете использовать регулярное выражение, например, /^\d+$/, но нет гарантии, что он работает при любых обстоятельствах. Использование результатов int и looks_like_number гарантирует результаты.

Я предполагаю, что список целых чисел может быть разделен запятыми или разделен запятыми или обоими, таким образом, мой split /[\s,]+/.

Вы сказали:

Единственное, что я могу думать получает каждое целое число из списка специально с помощью STDIN. Есть лучший способ сделать это?

Вы читаете данные из дескриптора файла, будь то файл или что-то вроде STDIN. Ничего подобного. Тем не менее, вы можете, по крайней мере, сделать это одним входом, а не по одному, что, я полагаю, вы имеете в виду.

Кстати, я мог бы совместил свой числовой тест с:

if(not looks_like_number $integer or $integer != $integer) { 

Поскольку это or заявления, если это будет сначала проверить, если $input выглядит цифровым, и если это не так, предупрежу о вводе перед проверкой, является ли это целым числом. Тем не менее, я не уверен, что это на самом деле яснее, чем сделать это слишком разными заявлениями.

#! /usr/bin/env perl 
# 
use strict; 
use warnings; 
use feature qw(say); 

use Scalar::Util qw(looks_like_number); 

my @integers;   # Storage for my integers 
# 
# Keep looping until you have a valid input 
# 
INPUT: 
for (;;) { 
    print "List of integers: "; 
    my $input = <STDIN>; 
    chomp $input; 
    @integers = split /[\s,]+/, $input; 
    # 
    # Verify inputted "number" is numeric and an integer 
    # 
    for my $integer (@integers) { 
     if(not looks_like_number $integer) { 
      warn qq(Invalid number entered: "$integer"); 
      next INPUT; 
     } 
     if($integer != int $integer) { 
      warn qq(Invalid integer entered: "$integer"); 
      next INPUT; 
     } 
    } 
    # 
    # Exit if there's at least one integer in @integers 
    # 
    last if @integers; 
} 
say "Integers: " . join ": ", @integers; 
Смежные вопросы