Ошибка в Perl Script;«Неинициализированное значение» ?; - PullRequest
2 голосов
/ 13 марта 2012

У меня есть следующий скрипт:

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 ]

2 голосов
/ 13 марта 2012

Нельзя использовать цикл postscript в операторе объявления.Предполагается, что переменная $sum должна увеличиваться в каждом цикле, что не может быть в той же инструкции, в которой она объявлена.Сначала вы должны объявить его, а затем присвоить ему с помощью цикла postscript:

my $sum;
$sum += $_ for @a;

Вы можете рассмотреть возможность использования List :: Util для этого и пропустить временную переменную @a.И перемещая say внутри цикла while:

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 голос
/ 13 марта 2012

В дополнение к ответу TLP вы можете использовать что-то вроде этого:

chomp(my @a = (<>));

в противном случае вы бы добавили value1\n' и value2\n. Это, конечно, все еще будет работать, но в какой-то момент вы можете спросить, откуда приходят все эти странные результаты ...

Я всегда пропускал что-то вроде foldl() для Perl, но, к счастью, есть List :: Util . Это добавляет немного синтаксического сахара ...

use List::Util qw/sum/;
chomp(my @a = (<>));
my $sum = sum @a;
say $sum;
0 голосов
/ 13 марта 2012

Вот один из способов сделать это; сравни и учись:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...