Perl,如何使这个脚本更小、更快、更好、更强



我是perl的新手,如何让它变得更好更快?(SPOJ任务(

until($i>99){
$a=<>;
if($a%5==0){
if($a%3==0){
print"SPOKOKOKOn";
}else{
print"SPOKOn";
}
}elsif($a%3==0){
print"KOKOn";
}else{
print"$a";
}
$i++;
}

可以被5整除的东西可以被15整除,所以你的逻辑更直接…

  • 可除以15
  • 可除以5
  • 可除以3
  • 不能被5或3整除

我也会利用say

我也会用for代替尴尬的until,而不必为$I而烦恼。

避免使用$a和$b,因为它们是sort使用的特殊变量。

打开"严格"one_answers"警告"。

去掉$a的换行符。从技术上讲,如果你要把它用作一个数字,这是不必要的,但如果你不打印它,它会有一个额外的换行符。

一个非数字%,任何东西都是0。除非我们验证输入,否则如果您不输入任何内容或";香蕉";你会得到SPOKOKOKO。我们可以用Scalar::Util::looks_like_number检查输入是否看起来像Perl认为的数字。如果它不是一个数字,则抛出一个异常;函数的工作不是弄清楚如何处理非数字。Perl实际上没有异常,但我们可以使用dieeval来接近它。

并将逻辑放入子程序中。这将输入和输出的细节从逻辑中分离出来。现在可以对逻辑进行命名、记录、测试和重用。这也避免了冗余的CCD_ 9。

use strict;
use warnings;
use Scalar::Util qw(looks_like_number);
use v5.10;
sub whatever_this_is_doing {
my $num = shift;
# Validate input early to keep the rest of the logic simple.
if( !looks_like_number($num) ) {
die "'$num' is not a number";
}
if($num % 15 == 0) {
"SPOKOKOKO";
}
elsif($num % 5 == 0) {
"SPOKO";
}
elsif($num % 3 == 0) {
"KOKO";
}
else {
$num;  # Note there's no need to quote a single variable.
}
}
for(1..99) {
my $num = <>;
chomp($num);
eval {
say whatever_this_is_doing($num);
} or say "'$num' is not a number.";
}

我相信有一些非常聪明的数学方法可以减少对%的调用次数,但%不太可能成为瓶颈,尤其是在Perl中,所以我不做它。

100行?这将是如此之快,以至于我不明白你为什么要求优化。然而

最大的两个成本是读取100行和写入100行。

然后是if和模检验——每一个都是无关紧要的。

需要考虑的一件事是把它翻过来。我建议1个循环内表达混乱的print

print  ( ($a%5 == 0) ?
( ($a%3 == 0) ? "SPOKOKOKOn" : "SPOKOn" ) :
( ($a%3 == 0) ? "KOKOn"      : $a        );

更少的线路(3对10(;可能更容易阅读(尤其是在列对齐的情况下(也许更快。

更容易消化。(我没有注意到%3是一样的。(哦,现在很明显,n在最后一个案例中缺失了;也许是个虫子?

也许可以删除一些括号,但我不相信Perl会对?:嵌套做正确的事情。

最新更新