如何接受整数列表作为输入?我唯一能想到的是使用STDIN专门从列表中获取每个整数。有更好的方法吗?
答案 0 :(得分: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
如果用户直接输入制表符分隔的数字字符串, 你可以使用splice函数来分隔字符串。
@array = splice(/\t/,$array[0])
答案 1 :(得分:0)
您想要输入整数的列表吗?我认为你的意思是你要输入一个数字列表,如果它们是全部整数,则接受该输入。
在这个程序中,我永远循环,直到我得到一个有效的列表,因此for (;;)
。有些人更喜欢while (1)
。
我使用Scalar::Util&#39; s looks_like_number
来测试输入是否为数字,然后使用int
来验证该数字是否为整数。您可以使用像/^\d+$/
这样的正则表达式,但不能保证它在所有情况下都能正常工作。使用int
和looks_like_number
可以保证结果。
我假设整数列表可以以空格分隔或以逗号分隔或两者兼而有之,因此我的split /[\s,]+/
。
你说:
我唯一能想到的是使用STDIN专门从列表中获取每个整数。有更好的方法吗?
您从文件句柄中读取数据,无论是文件还是STDIN
之类的内容。没办法解决这个问题。但是,你至少可以把它作为单个输入,而不是我认为你的意思。
顺便说一句,我可以将我的数字测试与:
结合起来if( not looks_like_number $integer or $integer != $integer ) {
由于这是一个or
语句,如果这首先检查$input
是否看起来是数字,如果它不是,则会在检查输入之前发出警告,看看它是否为&#39} ; s是整数。但是,我不确定这实际上是否比单独陈述更清晰。
#! /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;
答案 2 :(得分:-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