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


in reply to Re^3: Foreach Loops
in thread Foreach Loops

(DROPS JAW)

Pardon me, Roy, if I thank you; that is absolutely brilliant. (Include Guinness ad here.) I've never seen that before, and I wouldn't have thought of it in a month of Sundays. I have no idea where I would use that in place of normal indexing, but I might have to go out of my way to use this just to keep my coworkers from thinking that Perl is simple. Nothing like some obscurata for enhancing job security.

--
tbone1, YAPS (Yet Another Perl Schlub)
And remember, if he succeeds, so what.
- Chick McGee

Replies are listed 'Best First'.
Re^5: Foreach Loops
by Roy Johnson (Monsignor) on Mar 16, 2005 at 13:57 UTC
    I'm glad you got a kick out it, but I really have to discourage you from using it for indexing. Can you imagine explaining it?
    "What the hell is this mess?"
    "Oh, I'm tracking the index of the element of the array."
    "That's how you get an array index in Perl?! That's ridiculous. We're switching everything to Visual Basic®!"
    The most common use of a flip-flop is to extract a range of lines from a file. You set the left side to match the start of the range, and the right side to match the end of the range. If either operand is a constant expression, it is implicitly compared to $. (the line number). That is what kept me from using a simple expression like (1==1)..(1==0). Actually, now that I think about it, the expressions I used ought to be constant expressions.

    Anyway, I did think of a couple interesting alternatives for always-true flip-flops.

    $index = (!$index)...(!$index); #or $index = ($.||1)..($.&&0);
    Note that in the former, I have to use the 3-dot version, so that both operands aren't evaluated on the same pass. $index starts out zero, so the left side is true. After that, it's non-zero, so the right side is false.

    The second example just incorporates a variable into an expression whose truth is constant. I used $. because of its association with the operator, but any variable would do.


    Caution: Contents may have been coded under pressure.