Perl脚本中的错误; “未初始化的价值”?

时间:2012-03-12 22:48:33

标签: perl

我有以下脚本:

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.

为什么我的代码没有添加所有输入?为什么会出现这个错误?

3 个答案:

答案 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;
    }
}