我是Perl的初学者,我真的很喜欢这种语言。我写了以下小程序。这是Codingame.com网站上的一款游戏。
chomp($n=<STDIN>);
if (!$n) {
print 0;
} else {
@t=split/ /,<STDIN>;
foreach $i(0..$n-1) {
$m=$t[$i]if(!$m)||(abs($t[$i])<abs($m))||(($t[$i]==-$m)&&($t[$i]>0));
}
}print $m;
此代码的目标是将最接近的数字提供给列表中的0,如果有-4
和4
,则它将始终返回正数。
$n
是列表中的数字数@t
是一个数组列表$m
是最低此代码似乎有效,但很难阅读。我想学习一些Perl秘密,使其更短,更优雅,更简单,更易于维护。
你可以给我建议重写吗?也许使用三元运算符或一行foreach
循环。
我真的不想要一个完美的代码作为答案,但有些迹象,然后我可以通过你的帮助搜索细节并自己学习。
答案 0 :(得分:4)
哎哟!
在您完全了解语言之前,请不要开始编写代码,并且可以编写并彻底调试程序
以下是我可以在您的代码中看到的问题,暂时忘记了您不会使用高尔夫代码的内容
@t = split / /, <STDIN>
将在每个空间分开。如果输入以空格开头,则@t
将在第一个元素中包含空字符串。如果数字之间有多个空格,则@t
中间会有空字符串。最后一个元素将附加一个尾随换行符,因为您尚未将其删除
foreach
和for
完全相同。大多数练习的Perl程序员在整个过程中使用for
,显然你应该在打高尔夫球的时候也这样做
没有理由要求输入多少个数字。这是一台可以统计它们的计算机,$n = @t
可以做得很好
!$m
为零或为空字符串,则 $m
为真,而不仅仅是在未定义时。这导致了这个错误
$ perl coding_game.pl
2
0 1
1
但是1不是零而不是零!
然后,如果你正在写真实的代码
始终 use strict
和use warnings 'all'
并声明所有变量my
尽可能接近其首次使用位置
为描述其目的的变量使用有意义的名称。 $n
没问题,但@t
不是
正确缩进代码,并查看perlstyle
以了解有助于体验Perl程序员理解您所写内容的内容
我建议更接近这个
use strict;
use warnings 'all';
die unless my @numbers = split ' ', <>;
my $best = shift @numbers;
for ( @numbers ) {
if ( abs $best > abs or $best < 0 and $best == -abs ) {
$best = $_;
}
}
print $best, "\n";