in reply to Re: Re: Elegantly Selecting Every 3rd Element in an Array.
in thread Elegantly Selecting Every 3rd Element in an Array.

Runrig,
Well, maybe I botched it, but all I did was change @array to my var @a like so:
my @a=qw(las vegas every saturday night third is my element); my @every_3rd = @a[grep { not ($_+1) % 3 } 0..$#a]; print "@every_3rd";
and tell it to print and it runs without error but prints nothing.
???
jg

Ain't no time to hate! Barely time to wait! ~RH

Replies are listed 'Best First'.
Re: Re: Re: Re: Elegantly Selecting Every 3rd Element in an Array.
by gbarr (Monk) on Sep 29, 2001 at 03:03 UTC
    It prints nothing because you have a precedence problem

    not ($_+1) % 3

    Will always evaluate to false as it is the same as

    (not ($_+1)) % 3

    Adding some parens in the right places

    not (($_+1) % 3)

    Should give the correct result

      Why do the parens change the precedence of the 'not'?? Seems like 'not' should still have the lowest precedence. Compare these two (which should return every third element, but start with the first), and tell me why they should be different:
      not $_ % 3 not ($_) % 3
      Update:tye explains below. My opinion (on current precedence rules, not tye's opinion) above.

        It is the old "if it looks like a function call" rule. Most commonly noted for: print ($this),$that getting parsed as print($this), $that but it also applies to other things, including the not "function". Update, the application of this particular rule to not appears to have been introduced in Perl 5.6.0, so it might even be a bug.

        BTW, the proof that this is the problem is that adding a unary "plus": not +($_+1) % 3 fixes it.

                - tye (but my friends call me "Tye")