Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re: grep flip flop (range operator)

by frozenwithjoy (Curate)
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).


Comment on Re: grep flip flop (range operator)
Select or Download Code
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

        Uh-oh

        $ perldoc -f ?? No documentation for perl function '??' found
Re^2: grep flip flop (range operator)
by frozenwithjoy (Curate) 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. :)


      Dave

        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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://993379]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2015-08-01 03:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (285 votes), past polls