摆脱perl号码加法器代码中的警告

时间:2013-12-11 23:12:37

标签: string perl input warnings

我正在编写一个程序,从命令行获取数字,直到用户输入一个空行。

如果用户输入既不是换行也不是数字的东西,它会通知用户,然后继续。

虽然一切正常,但我已经开启了警告,如果输入的内容无效,它似乎不喜欢第二个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";

2 个答案:

答案 0 :(得分:3)

Perl做得非常DWIM。它以它而闻名。

所以,无论你来自哪种语言 - 它看起来像C - 忘记检查字符串和数字:Perl标量变量就是你要求的那样。

这意味着类似

elsif ($input == 0 && $input ne '0' && $input ne '') {

没什么意义。从键盘读取的任何内容最初都是字符串,但如果需要,它将是一个数字。您要求$input评估为零但不是文字字符串0。这适用于非常少的字符串,例如000e0

我认为这就是你的意思。请看一下。

没有评论,这不是更清楚吗?

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";
}