我正在编写一个程序,从命令行获取数字,直到用户输入一个空行。
如果用户输入既不是换行也不是数字的东西,它会通知用户,然后继续。
虽然一切正常,但我已经开启了警告,如果输入的内容无效,它似乎不喜欢第二个if条件。
Argument "foo" isn't numeric in numeric eq (==) at adder.pl line 25, <STDIN> line 4.
我不喜欢用这个警告运行程序。如何改进我的代码?
这是我的程序
#!/usr/bin/perl
use strict;
use warnings;
#declare variable
my $number = 0; #final answer
my $input;
#prompt the user
print "Input some integers, line by line. When you are done, press return to add them up." . "\n";
while (1) {
#get input from user
$input = <STDIN>;
#remove newlines
chomp($input);
#user pnches in newline
if ($input eq '') { #if the answer is new line
#quit the loop
last;
} #end of if statement
#user punches in bad input
elsif ($input == 0 && $input ne '0' && $input ne '') {
#tell the user what happened and how to rectify it
print "Input must be an integer." . "\n";
} # end of elsif statement
else {
chomp($input);
$number += $input;
} # end of else statement
} #end of while
print "Total is: $number\n";
答案 0 :(得分:3)
Perl做得非常DWIM。它以它而闻名。
所以,无论你来自哪种语言 - 它看起来像C - 忘记检查字符串和数字:Perl标量变量就是你要求的那样。
这意味着类似
elsif ($input == 0 && $input ne '0' && $input ne '') {
没什么意义。从键盘读取的任何内容最初都是字符串,但如果需要,它将是一个数字。您要求$input
评估为零但不是文字字符串0
。这适用于非常少的字符串,例如00
或0e0
。
我认为这就是你的意思。请看一下。
没有评论,这不是更清楚吗?
use strict;
use warnings;
print "Input some integers line by line. When you are done, press return to add them up\n";
my $total = 0;
while (<>) {
chomp;
last unless /\S/;
if (/\D/) {
print "Input must be an integer\n";
next;
}
$total += $_;
}
print "Total is: $total\n";
答案 1 :(得分:1)
由于Perl是无类型的,并且您使用$ input作为数字和字符串,因此您会收到该警告,因为“foo”不是数字而“==”用于比较数字的相等性。
首先需要检查$ input是否为数字。一个建议:
if ($input =~ /^\d+$/)
{
$number += $input;
}
else
{
print "Input must be an integer.\n";
}