Perl声明了从数组设置的变量的未初始化值

时间:2018-11-09 05:25:11

标签: perl

我不确定为什么要这样做,但是确实如此。我有一个项目正在努力保持得分,并将其保存到文本/数据文件中。它还会显示保存在文件中的信息以及其他一些东西。现在,我有一组正在尝试工作的代码。我已经设置了文件,以便它自动运行某个子程序,但是我试图触发显示数据的子程序。我使用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 :(得分:2)

关于您的代码的一些建议。

您应该检查是否打开了一个空文件并采取适当的措施:

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循环通常比C风格的for循环容易理解。

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

您可以通过遍历数组元素而不是数组索引来进一步简化操作。

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

或者使用循环的后缀版本将其重写。

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

最后,如果要在完全正常的情况下退出程序,请使用exit而不是die

这些建议中的第一个将解决您遇到的问题。