2007年 02月 28日

perlsub

& をプロトタイプに書いてやれば呼出元の sub を省略できるよと聞いたことがあるのでやってみた

sub each(&@) {
	my($block, @array) = @_;
	foreach (@array) {
		&$block($_);
	}
}

each {
	dump $_;
} 1, 2, 3; #=> syntax error at foo.pm line n, near "}"

うまくいかない。

sub mygrep (&@)	     mygrep { /foo/ } $a, $b, $c
http://perldoc.perl.org/perlsub.html#Prototypes-prototype-subroutine%2c-prototype

何が違うんだろう。try catch の例は実行できる。うーんんんんんんんんんん

sub each {
	my($block, @array) = @_;
	foreach (@array) {
		&$block($_);
	}
}

each(sub {
		print $_;
}, 1, 2, 3); #=> Type of arg 1 to each must be hash (not list) 

これもうまくいかない。えぇえ

package Array;
use strict;
use warnings;

sub new {
	my($class, @array) = @_;
	bless {
		native => ¥@array,
	}, $class;
}

sub each($&) {
	my($self, $block) = @_;
	foreach (@{$self->{native}}) {
		&$block($_);
	}
}

package main;
use P;

my $foo = Array->new(1, 2, 3);

$foo->each(sub {
	dump $_
});

これはうまくいく。わかんなすぎる。驚き最大の法則