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

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题?请通过在GitHub上打开问题或拉取请求来帮助我们。