http://qs321.pair.com?node_id=1227154


in reply to Re: Grep Pattern
in thread Grep Pattern

That's the approach I would recommend as well. But you kinda messed up on the implementation.
my @pat = ( 0, 1, 1, 0 ); my @result = grep { $pat[ $_ % @pat ] } 0..12;

Replies are listed 'Best First'.
Re^3: Grep Pattern
by LanX (Saint) on Dec 12, 2018 at 16:43 UTC
    > But you kinda messed up on the implementation.

    Not really, you are filtering the sample input, hdb is filtering any input by a "repeating pattern".

    update
    DB<10> @pat = ( 0, 1, 1, 0 ); DB<11> x $i=0;grep { $pat[ $i++ % 4 ] } a..l; 0 'b' 1 'c' 2 'f' 3 'g' 4 'j' 5 'k' DB<12>

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

      Exactly. Like in the original question. "0..12" is an unfortunate choice for the sample input as $_ is always the same as $i in this case. Your test data illustrates better what really goes on.

      I stand by what I said. Even just hardcoding the 4 warranted horror. And you are mistaken about the restrictiveness of my code.

      @a[ grep { $pat[ $_ % @$pat ] } 0..$#a ]
      or
      sub filter_by_pat { my $pat = shift; return @_[ grep { $pat->[ $_ % @$pat ] } 0..$#_ ]; } filter_by_pat [0,1,1,0], ...
        > And you are mistaken about the restrictiveness of my code.

        Not really.

        There are many occasion where you need to handle a pure list in Perl and your array slice requires storing it in an array.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^3: Grep Pattern
by Aldebaran (Curate) on Dec 15, 2018 at 00:38 UTC

    that's elegant...

    $ ./1.grep_pattern.pl result is 1 2 5 6 9 10 $ cat 1.grep_pattern.pl #!/usr/bin/perl -w use 5.011; my @pat = ( 0, 1, 1, 0 ); my @result = grep { $pat[ $_ % @pat ] } 0..12; say "result is @result"; __END__ $
      > that's elegant..

      One should even be able to shorten it to (can't test right now)

       grep { (0,1,1,0)[ $_ % 4 ] } 0..12;

      But it's not as DRY, cause you need to change the 4 if you change the list.

      And of course it's not answering the OP s real question to filter any list.

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

        I was about to say it also creates a shitload of scalars, but it doesn't. `0,1,1,0` repeatedly places the same 4 scalars on the stack. They are created at compile-time and associated with the opcode that returns them. Not bad