Perl запрашивает неинициализированное значение для переменной, которая была установлена ​​из массива - PullRequest
0 голосов
/ 09 ноября 2018

Я не уверен, почему он это делает, но это так. У меня есть проект, над которым я работаю, чтобы сохранить счет и сохранить его в текстовые файлы / файлы данных. это также покажет информацию, сохраненную в файле, и несколько других вкусностей. Прямо сейчас у меня есть набор кода, который я пытаюсь заставить работать. У меня есть файл, настроенный так, что он автоматически запускает определенную подпрограмму, но я пытаюсь вызвать подпрограмму, которая показывает данные. Я запускаю скрипт, используя perl scorecard.pl --display-file scores.dat, и получаю следующее:

    Use of uninitialized value $gn in print at scorecard.pl line 30.
    Use of uninitialized value $gt in print at scorecard.pl line 30.
    Use of uninitialized value $gp in print at scorecard.pl line 30.
    Game '' was started  with  players.
    these were the scores:
    Use of uninitialized value $gp in numeric lt (<) at scorecard.pl line 31.
    Died at scorecard.pl line 35.
    Welcome to scorecard
    A simple scorecard script

    What game would you like to score?
    ^C

Вот код для дисплея:

    sub dispfile()
    {
        my ($opt_name, $dfile) = @_;
        open (my $fhd,'<',$dfile)
         or die "Could not open file '",$dfile,"'.\n";
        chomp(my @ls = <$fhd>);
        my $gt = $ls[0];
        my $gn = $ls[1];
        my $gp = $ls[2];
        print "Game '",$gn,"' was started ",$gt," with ",$gp," players.\nthese were the scores:\n";
        for(my $i=3;$i<$gp;$i++){
            print $ls[$i];
            }
        close $fhd;
        die;
        }

Весь проект в настоящее время находится на моем github, и я загрузил последнюю версию в мою ветку dev-0.1-r2: GitHub - scorecard.pl

1 Ответ

0 голосов
/ 09 ноября 2018

Несколько предложений по вашему коду.

Вы должны проверить, открыли ли вы пустой файл, и предпринять соответствующие действия:

chomp(my @ls = <$fhd>);
die "No data in file $dfile\n" unless @ls;

Вы можете использовать списки для упрощения следующей строки:

my ($gt, $gn, $gp) = @ls;

Вы можете использовать интерполяцию строк для упрощения вашей строки print():

print "Game '$gn' was started $gt with $gp players.\nthese were the scores:\n";

Цикл foreach обычно гораздо проще понять, чем цикл for в стиле C.

foreach (3 .. $#ls) {
  print $ls[$_];
}

Вы можете упростить это еще больше, перебирая элементы массива, а не индексы массива.

foreach (@ls[3 .. $#ls]) {
  print $_;
}

Или, возможно, переписать его, используя постфиксную версию цикла.

print foreach @ls[3 .. $#ls];

И, наконец, если вы хотите выйти из программы в совершенно нормальных условиях, тогда используйте exit вместо die.

Первое из этих предложений решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...