Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Re: grep flip flop (range operator)

by frozenwithjoy (Priest)
on Sep 13, 2012 at 06:40 UTC ( #993379=note: print w/replies, xml ) Need Help??

in reply to grep flip flop (range operator)

My understanding is that with Range Operators, if you have 1 .. /Q/, the 1 is short for $. == 1, so it will flip on and start printing at the first line of input from a file. The last example you are using is the only one that is reading from a file and, therefore, is the only one that flips on and prints.

Edit: for those that are unfamiliar with $., is is a special variable that equals the "current line number for the last filehandle accessed" (see perlvar).

Replies are listed 'Best First'.
Re^2: grep flip flop (range operator)
by Anonymous Monk on Sep 13, 2012 at 07:02 UTC

    Bingo. Thanks.

    That "Range Operators" page I have now read in my console via perldoc -f ..

    It dawned on me after posting that the first condition is never true and I came up with

    $ perl -le " print for grep { my $what = scalar($Q++==0 ..($_ eq q{Q} +)); warn $what; $what } qw{ a b c Q r s }; " 1 at -e line 1. 2 at -e line 1. 3 at -e line 1. 4E0 at -e line 1. Warning: something's wrong at -e line 1. Warning: something's wrong at -e line 1. a b c Q
      To make things a bit more readable, you could use the match-once operator like this:
      perl -le " print for grep ?? .. /Q/, @ARGV " a b c Q r s ___ a b c Q


        $ perldoc -f ?? No documentation for perl function '??' found
Re^2: grep flip flop (range operator)
by frozenwithjoy (Priest) on Sep 13, 2012 at 07:12 UTC

    BONUS STUMPER: For all of the ones that don't print, they do print if you replace 1 with 0; however, all elements are printed instead of stopping at Q (shown below). For the one that did print, the change to 0 causes it to not print. Anyone able to explain this?

    a b c Q r s
      perl -E 'say "Yes!" if $. == 0;'

      $. uninitialized if there's no file open for reading (undef). undef is false. In a numeric comparison, undef is promoted to zero (or conceptually better, zero is demoted to false, and undef is promoted to false). Consequently, 0 .. is true, and the flip flop flips.

      If warnings were enabled you'd get one. :)


        Ah, yes.... and the reason it doesn't stop at Q is because it gets flipped right back on after Q. Apparently, my brain only works once per night. Thanks!
      Whole list is printed, as after spotting 'Q' flip-flop goes to 'false' state and back to condition $. == 0 which is all the time true, so it sets flip-flop again to true.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://993379]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (3)
As of 2018-01-21 03:50 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (227 votes). Check out past polls.