#!/usr/bin/perl -- use strict; use warnings; use Data::Dump; my $str = "xxxx yy zzzzz xxxx qqq sixsix"; my $lengthy = do { my @lengths = ( 2, 6, 6 ); my $lix = 0; sub { warn "shabba @_ $_"; if( $lix < @lengths and $lengths[ $lix ] == length $_ ){ $lix++; return !!1; } return !!0; } }; #~ grep 1, #~ my @list = grep $lengthy, split /\W/, $str; #~ grep 1, #~ my @list = grep sub { $lengthy->() }, split /\W/, $str; #~ slower #~ my @list = grep { $lengthy->() } split /\W/, $str; my @list = grep $lengthy->() , split /\W/, $str; dd \@list; __END__ shabba xxxx at funk line 8. shabba yy at funk line 8. shabba zzzzz at funk line 8. shabba xxxx at funk line 8. shabba qqq at funk line 8. shabba sixsix at funk line 8. ["yy", "sixsix"]