接受用户输入perl

时间:2015-04-04 20:33:22

标签: perl subroutine

如何接受整数列表作为输入?我唯一能想到的是使用STDIN专门从列表中获取每个整数。有更好的方法吗?

3 个答案:

答案 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+$/这样的正则表达式,但不能保证它在所有情况下都能正常工作。使用intlooks_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