#!perl -l sub Iterator (&) { $_[0] } sub igrep (&$) { my ($check, $iterator) = @_; sub { local *_; my @data; my $wantarray = wantarray; while(@data = ($wantarray ? $iterator->() : scalar $iterator->())) { *_ = \ $data[0]; return $wantarray ? @data : $data[0] if $check->(@data); } return undef; } }