最近、見始めたサイトです。英語圏のPerl関連のニュースがまとまってていい感じです。
advent calendar 2013も始まりました。
新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1を、やってみました。
hirontさん、ある意味凄いコードですね。新人の私でもそうそうこんなコードかけませんよ。。
E判定より
hirontさん、凄いコードですねっ!!私にはこんな効率のいいコード書けませんっ!
S判定より
野田s……涙拭いてもいいですか。
あなたがLispを無視することができない理由より、Perlでは構文解析が必要とのことだったので、素のPerlで書けるか試してみる。
use 5.016;
use warnings;
package _Alias;
sub TIESCALAR { bless \(my $dmy = \($_[1])), $_[0] }
sub FETCH { ${${$_[0]}} }
sub STORE { ${${$_[0]}} = $_[1] }
package main;
sub args {
my @list = map{ \$_ } @_;
return sub {
foreach(@list){
tie ${$_}, '_Alias' => shift();
}
};
}
sub with {
my ($methods, $hash, $f) = @_;
sub{
foreach(@{$methods}){
tie $_[@_], '_Alias' => $hash->{$_};
}
goto $f;
}->();
}
my $me = { name => "foobar", age => 26 };
with([qw(age)] => $me, sub{
args(my $age)->(@_);
$age++;
});
with([qw(name age)] => $me, sub{
args(my ($name, $age))->(@_);
printf("I'm %s. %d years old.\n", $name, $age);
});
書けない事はないけど……という感じです。