PerlのmapをPerlで実装(車輪の再発明)
聞かれて答えられなかったので調べて書いた。
キモは関数で受け取る引数の制限(プロトタイプ)を利用。
&を第一引数として指定した場合には、ブロックごと受け取れるとのこと。
ブロックを受け取れるのは第一引数だけね。
プロトタイプ使うことないなーと思って読み飛ばしてたわ。
参照
第140回 ブロックを渡せるのはRubyだけじゃない! Perlだって渡せるんだ! - bingo_nakanishiの他言語出身者のためのPerl入門
以下ソース
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; $Data::Dumper::Indent = 1; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Terse = 1; my @base_arr = (1 .. 5); print 'all_incr ' , '-'x33 , "\n"; print Dumper all_incr(@base_arr); print 'all_incr_own ' , '-'x33 , "\n"; print Dumper all_incr_own(@base_arr); sub all_incr { my @arr = @_; map { my $num = $_; ++$num } @arr; } sub own_map (&@); sub all_incr_own { my @arr = @_; own_map { my $num = $_; ++$num } @arr; } sub own_map (&@) { my $code = shift; my @return_arr; foreach (@_) { push @return_arr, $code->(); } return @return_arr; } 1;
結果
all_incr --------------------------------- 2 3 4 5 6 all_incr_own --------------------------------- 2 3 4 5 6