SPUG: double-dot stylin'

Michael R. Wolf MichaelRWolf at att.net
Thu Apr 22 09:17:19 CDT 2004


As a way to illustrate how the double-dot operator (in a scalar
context) operates as a flip-flop, I put this code together. It's a
classic example of parsing an email message -- the header is the first
line through a blank line; the body is the rest.


while (<>) {
    if (1 .. /^\s*$/) {
	push @header, $_;
    } else {
	push @body, $_;
}

Then I started playing golf, taking away unnecessary code, and
refactoring.

Unfortunately this minimal version didn't work

    push 1 .. /^\s*$/ ? @header : @body, $_ while (<>);

So I repeated the 'push' and '$_' (ugh... repeated code -- what would
Fowler say?) and came up with this.

    1 .. /^\s*$/ ? push @header, $_ : push @body, $_ while (<>);

But even with 8 years of Perl under my belt, it's too dense and
cryptic for me to look at.

This at least exposes the "?" in a way that hints at the ternary
operator, but it's not so obvious that the 'while' is a modifier, and
subordinate to the ternary, instead of an empty loop.

    1 .. /^\s*$/           ? 
        push @header, $_   : 
        push @body, $_ 
    while (<>);

I'm sure Tim will suggest getting rid of the 'while' at the end, but
that takes up another whole line and two printable characters....

    while (<>) {
        1 .. /^\s*$/           ? 
            push @header, $_   : 
            push @body, $_
    }            

Better formatting ideas?

-- 
Michael R. Wolf
    All mammals learn by playing!
        MichaelRWolf at att.net





More information about the spug-list mailing list