Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接受用户输入perl_Perl_Subroutine - Fatal编程技术网

接受用户输入perl

接受用户输入perl,perl,subroutine,Perl,Subroutine,如何接受整数列表作为输入?我唯一能想到的就是使用STDIN从列表中获取每个整数。有更好的方法吗?这里有一种方法,使用逗号分隔的整数列表: my $input = <STDIN>; chomp($input); if ($input !~ m/^(\d+(,\d+)*)?$/) { die('invalid input'); } my @input = split(/,/, $input ); my$input=; chomp($输入); 如果($input!~m/^(\d+(,\d

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

这里有一种方法,使用逗号分隔的整数列表:

my $input = <STDIN>;
chomp($input);
if ($input !~ m/^(\d+(,\d+)*)?$/) { die('invalid input'); }
my @input = split(/,/, $input );
my$input=;
chomp($输入);
如果($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
my@input;
while(my$input=){
chomp($输入);
如果($input!~m/^\d+$/){die('invalid input');}
推送(@input,$input);
}##结束时
我就是这样做的:

$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;
如果用户直接输入以制表符分隔的数字字符串, 可以使用“拼接”功能分离字符串

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

您想输入一个整数列表吗?我想你的意思是你想输入一个数字列表,如果它们都是整数,就接受这个输入

在这个程序中,我一直循环,直到得到一个有效的列表,因此(;;)。有些人喜欢
,而(1)

我使用's
looks\u like\u number
测试输入是否为数字,然后使用
int
验证该数字是否为整数。您可以使用像
/^\d+$/
这样的正则表达式,但不能保证它在所有情况下都能工作。使用
int
看起来像数字
可以保证结果

我假设整数列表可以是空格分隔的或逗号分隔的,或者两者都是,因此我的
split/[\s,]+/

你说:

我唯一能想到的就是使用STDIN从列表中获取每个整数。有更好的方法吗

从文件句柄读入数据,无论是文件还是类似于
STDIN
。没办法。然而,你至少可以让它成为一个单一的输入,而不是一次一个,我想你的意思是

顺便说一句,我可以将我的数字测试与:

if( not looks_like_number $integer or $integer != $integer ) {
由于这是一个
语句,如果首先检查
$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;
#/usr/bin/env perl
#
严格使用;
使用警告;
使用特征qw(例如);
使用Scalar::Util qw(看起来像数字);
我的@integers;#存储我的整数
#
#保持循环,直到您有一个有效的输入
#
输入:
对于(;;){
打印“整数列表:”;
我的$input=;
chomp$输入;
@整数=拆分/[\s,]+/,$input;
#
#验证输入的“数字”是否为数字和整数
#
对于我的$integer(@integers){
if(看起来不象\u number$integer){
警告qq(输入的无效数字:$integer”);
下一个输入;
}
如果($integer!=int$integer){
警告qq(输入的整数无效:$integer”);
下一个输入;
}
}
#
#如果@integers中至少有一个整数,则退出
#
最后一个if@整数;
}
说“整数:”。连接“:”,@整数;

您必须解释从文件句柄读取数据的问题所在,因为没有其他方法可以将数据获取到程序中,而且很难猜测更好的方法是什么。接受输入的方法有很多种。您想使用哪一个?当您显示代码或输出时,将行缩进四个空格,这样它就会显示为一个程序。您可以通过单击上面的
edit
查看我是如何做到这一点的。您从未验证过您的输入,如果您输入非整数,这可能会成为一个问题。你也从来没有咀嚼过你的输入,这就是为什么每个输入都在一行的原因。每个数字的末尾都有一个隐藏的新行。谢谢你,大卫。此外,还必须将-1与pop一起移除。我会编辑的!如果您想要一行
If
,请反向使用:
die qq(无效输入)If$input!~/^\d+$/
#! /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;