tokuhirom's Blog

Source Filters in @INC

perl5.8.9 から入ったという、@INC のなかに coderef ぶっこんどいて、ソースフィルタするという機能。
をためしてみる。

package OreOreFilter;
use strict;
use warnings;
use File::Spec;

sub import {
    unshift @INC, new OreOreFilter();
}

sub new { bless {}, shift }
sub OreOreFilter::INC {
    my ($self, $fname) = @_;
    for my $inc (@INC) {
        next if ref $inc;
        my $real = File::Spec->catfile($inc, $fname);
        next unless -f $real;

        open my $fh, '<', $real or die $!;
        return ($fh, sub {
            $_ =~ s/hello/hi/;
            $_ ? 1 : 0;
        });
    }
    return;
}

1;
package Foo;

sub foo { print "hello\n" }

1;
% ./perl -I. -e 'use OreOreFilter; require Foo; Foo->foo'
hi

で、これでいいのかなーとおもったんだけど、これ perl5.8.8 でもうごくね!

なんか違うのかな。。。