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