Perl の例外処理の勉強がてら Try::Tiny の実装を眺めていたところ、今更ながらサブルーチンの引数としてサブルーチンリファレンスを指定できることを知った若輩者でございます。。こういうテクニシャンぽいことはすぐ忘れるのでメモ。


例えば

サブルーチンリファレンスを引数にとると、grep { ... } @arraymap { ... } @array みたいな、いかにも構文チックな関数を定義できる。

試しに、grep と逆のことをする eliminate なるものをつくってみた。

use strict;
use warnings;

use feature 'say';

sub eliminate (&@) {
    my ($block, @array) = @_;

    my @result;
    for (@array) {
        unless ($block->()) {
            push @result, $_;
        }
    }

    @result;
}

my @array = (3,'m',-2,0,'t',-8,2,0,5,'k',1,9,'c',-4,-6,'h',7,1);
say eliminate { $_ =~ /^-?\d+$/ && ($_ > 1 || $_ < 0) } @array;

実行結果は以下。

m0t0k1ch1


注意点

  • サブルーチンリファレンスを指定可能なのは第一引数だけで、& で指定する