shimxmemo

メモをのこすよ!

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