我有以下脚本:
use 5.12.4;
use strict;
use warnings;
say "Enter a functionality:";
while (<>) {
if (/add/) {
say "Enter your numbers:";
my @a = (<>);
my $sum += $_ for @a;
say $sum;
}
}
当我运行此程序时,它会提示:
输入功能:
我输入add
并说:
Enter your numbers:
我在单独的输入行中输入了几个数字,然后输入[ctrl]Z
并收到以下错误:
Use of uninitialized value $sum in say at C:\myperl\Math-Master\math-master.pl l
ine 11, <> line 9.
为什么我的代码没有添加所有输入?为什么会出现这个错误?
答案 0 :(得分:2)
您不能在声明语句中使用postscript循环。变量$sum
应该在每个循环中递增,它不能在声明它的同一语句中。您必须首先声明它,然后使用postscript循环分配给它:
my $sum;
$sum += $_ for @a;
您可以考虑使用List::Util来跳过临时变量@a
。并在while循环中移动say
:
use List::Util qw(sum);
say "Enter a functionality:";
while (<>) {
if (/add/) {
say "Enter your numbers:";
say "Sum: ", sum(<>);
}
say "Enter a functionality:";
}
但这有点笨拙。为什么不:
while (<>) {
if (/add/) {
say "Enter your numbers, separated by space: ";
say "Sum: ", sum(split " ", <>);
}
}
这样,你不必按ctrl-Z(ctrl-D)来停止输入。
答案 1 :(得分:1)
除了TLP回答,您可以考虑使用以下内容:
chomp(my @a = (<>));
否则您将添加value1\n'
和value2\n
。这当然仍然有效,但你可能会在某种程度上想知道所有这些奇怪的结果来自哪里......
对于Perl,我总是错过foldl()
之类的东西,但幸运的是List::Util。它增加了一些语法糖......
use List::Util qw/sum/;
chomp(my @a = (<>));
my $sum = sum @a;
say $sum;
答案 2 :(得分:0)
这是一种方法;比较和学习:
use 5.012; # implies 'use strict'
use warnings;
say "Enter a functionality:";
while (<>) {
if (/add/) {
say "Enter your numbers:";
my @nums;
while (1) {
my $in = <>; # read one line
last unless $in =~ m/^\d+$/; # only numbers
push @nums, $in;
}
next unless @nums;
my $sum;
$sum += $_ for @nums;
say $sum;
}
}