Perl极客徽章竞赛结果

四周前我们宣布了Perl极客徽章竞赛,邀请读者向我们发送他们最喜欢的Perl代码技巧,无论大小。经过深思熟虑,我们选出了获奖者。继续阅读以了解我们的获奖作品……
调用者备忘录 - Paul Boyd
Paul提交了一个使用Perl的备忘录化调用子例程的解决方案,使用了Perl的caller函数。Paul的演示脚本如下。 “aggressively_memoize”子例程将备忘录化调用函数的结果,以便在以相同参数重复调用时,备忘录化器返回存储的结果而不是重新计算。酷吧?
要查看此操作,只需将下面的脚本复制并保存为“memoizer.pl”。 打开终端,输入
$ chmod 755 memoizer.pl
$ ./memoizer.pl
或者如果你在Windows上,在cmd.exe或PowerShell中
>perl memoizer.pl
#!/bin/env perl
use strict;
use warnings;
use v5.12;
sub aggressively_memoize {
my $caller_num = shift // 1;
my $caller = (caller($caller_num))[3];
return unless $caller;
my ($package, $sub_name) = $caller =~ /(.*)::(.*?)$/;
return if $sub_name eq '__ANON__';
my $orig = $package->can($sub_name);
my %cache;
my $new_sub = sub {
aggressively_memoize(2);
my $key = join("\0", @_);
# FIXME: Should check wantarray, this doesn't work in list context.
unless (exists $cache{$key}) {
$cache{$key} = $orig->(@_);
}
# Uncomment this if you wonder whether or not the cache is getting hit:
#else {
# warn 'hit';
#}
return $cache{$key};
};
{
no strict 'refs';
no warnings 'redefine';
*{$caller} = $new_sub;
}
return;
}
sub add {
# Comment this out to see the performance difference
aggressively_memoize();
my $result = 0;
$result += $_ for @_;
return $result;
}
sub fib {
my $n = shift;
return 0 if $n <= 0;
return 1 if $n == 1;
return fib(add($n, -1)) + fib(add($n, -2));
}
say fib(40);
单行循环中的END块 - Josh Goldberg
Josh提交了一个带巧妙的循环Perl单行脚本 - 一旦循环结束,单行脚本使用Perl的END块执行最终代码块。例如,这可以用于处理Web服务器日志,然后总结日志统计信息
$ cat /var/log/httpd/access_log |perl -lne '/20\d\d:\d\d:\d\d/;$counts{$&}++;$t++}END { for (sort keys %counts) { print "$_: $counts{$_} (".sprintf("%.02f",$counts{$_}/$t*100)."%)" }'
在Apache或Nginx访问日志上运行上述代码得到以下结果
2013:08:27: 1 (3.85%)
2013:08:28: 4 (15.38%)
2013:08:29: 1 (3.85%)
2013:08:40: 1 (3.85%)
2013:08:45: 1 (3.85%)
2013:08:54: 1 (3.85%)
2013:08:56: 2 (7.69%)
2013:09:02: 9 (34.62%)
2013:09:08: 1 (3.85%)
2013:09:18: 1 (3.85%)
2013:09:31: 2 (7.69%)
2013:15:50: 1 (3.85%)
2013:15:53: 1 (3.85%)
多核Mojolicious Web应用 - Justin Hawkins和Mario Roy
是的,你没看错 - Justin和Mario的提交是一个并行处理Mojolicious Web应用。这个概念验证应用计算目录中所有文件的MD5哈希值。它结合了Mojolicious的非阻塞Web循环和Mario的MCE模块(PerlTricks的最爱)来在主机机的所有可用核心上分配处理。
要尝试该应用,您需要安装Mojolicious::Lite模块,您可以从CPAN获取。只需打开终端并输入
$ cpan Mojolicious::Lite
获取应用程序代码并将其保存为“mce_mojolicious.pl”。 在终端中输入
$ chmod 755 mce_mojolicious.pl
$ ./mce_mojolicious.pl daemon
或者如果你在Windows上,在cmd.exe或PowerShell中输入
>perl mce_mojolicious.pl daemon
应用将启动,并将浏览器指向http://localhost:3000以查看应用的实际效果!
结论
非常感谢所有参赛者,祝贺我们的获奖者。专属的Perl极客徽章正在送往他们手中。还要感谢brian d foy,他运行了crowdtilt活动,使这一切成为可能。
喜欢这篇文章?帮助我们并转发它!
本文最初发布在PerlTricks.com。
标签
反馈
这篇文章有什么问题?请通过在GitHub上打开问题或拉取请求来帮助我们。