如何在Perl中编写优雅的代码

时间:2016-02-04 01:05:13

标签: perl

我是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,如果有-44,则它将始终返回正数。

  • $n是列表中的数字数
  • @t是一个数组列表
  • $m是最低

此代码似乎有效,但很难阅读。我想学习一些Perl秘密,使其更短,更优雅,更简单,更易于维护。

你可以给我建议重写吗?也许使用三元运算符或一行foreach循环。

我真的不想要一个完美的代码作为答案,但有些迹象,然后我可以通过你的帮助搜索细节并自己学习。

1 个答案:

答案 0 :(得分:4)

哎哟!

在您完全了解语言之前,请不要开始编写代码,并且可以编写并彻底调试程序

以下是我可以在您的代码中看到的问题,暂时忘记了您不会使用高尔夫代码的内容

  • @t = split / /, <STDIN>将在每个空间分开。如果输入以空格开头,则@t将在第一个元素中包含空字符串。如果数字之间有多个空格,则@t中间会有空字符串。最后一个元素将附加一个尾随换行符,因为您尚未将其删除

  • foreachfor完全相同。大多数练习的Perl程序员在整个过程中使用for,显然你应该在打高尔夫球的时候也这样做

  • 没有理由要求输入多少个数字。这是一台可以统计它们的计算机,$n = @t可以做得很好

  • 如果!$m为零或为空字符串,则
  • $m为真,而不仅仅是在未定义时。这导致了这个错误

    $ perl coding_game.pl
    2
    0 1
    1
    

    但是1不是零而不是零!

然后,如果你正在写真实的代码

  • 始终 use strictuse 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";