http://www.perlmonks.org?node_id=1019181


in reply to match sequences of words based on number of characters

add use re 'debug'; to see what the regex engine is doing, and why your match fails

Then, use my @list = grep $lengthy, split /\W/, $str

Where

my $lengthy = do { my @lengths = ( 2, 6, 6 ); my $lix = 0; sub { if( $lix < @lis and $lengths[ $lix ] == length $_ ){ $lix++; return !!1; } return !!0; } };
or whatever counting logic you require

Replies are listed 'Best First'.
Re^2: match sequences of words based on number of characters
by AnomalousMonk (Archbishop) on Feb 17, 2013 at 20:09 UTC

    I tried a few variations and I can't seem to make that work. Can you supply a self-contained, working example?

      Hi, when I run your code it produces nothing. Did I miss something? Thanks for your advice, nicemank.

        Are you replying to me (AnomalousMonk) or to the Anonymous Monk?

      I tried a few variations and I can't seem to make that work.

      Show your efforts :)

      What do you think is wrong with it?

      Can you supply a self-contained, working example?

      Theoretically :) did you try Basic debugging checklist?

      I think this ought to show what is wrong with my syntax

      #!/usr/bin/perl -- use strict; use warnings; use Data::Dump; my $str = "xxxx yy zzzzz xxxx qqq"; my $lengthy = sub { warn 1 }; my @list = grep $lengthy, split /\W/, $str; dd \@list; __END__

      Its basically as if I wrote grep 1, ...

      and here I thought grep knew to take a subroutine reference, it works with grep \&somename, but it has to be grep $lengthy->(),...

      And on top of that no warnings of any kind, surprising

        #!/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"]