SPUG: flip-flops
Michael R. Wolf
MichaelRunningWolf at att.net
Sun Feb 10 13:47:36 CST 2002
dancerboy <dancerboy at strangelight.com> writes:
[...]
> Perhaps my complaint should more properly be with the
> docs, rather than with the operator itself. To be
> perfectly honest, I read and reread that section of the
> docs, and eventually just gave up; I *still* don't fully
> understand what .. and ... do in scalar context. And I
> don't think that I'm particularly dense when it comes to
> things like this -- if I had difficulty understanding it,
> I'm pretty sure most other developers will have difficulty
> with it as well. It's possible that, if the docs
> contained a more coherent explanation of what these things
> do, I might change my opinion. But given the current
> state of the docs, I'd say scalar .. is going to be
> difficult for the average Perl developer to decipher.
I, too, had a hard time with that documentation. It sat on
the back burner for a few years before it became *very*
useful. Then, as Colin pointed out, the alternative code
introduced a stuctural variable and a complex control
structure that was better coded with the flip-flop control
structure than the equivalent long idiomatic phrase.
Again, as you suggest, a good example would overcome bad
documentation and prevent even worse code. Here's an
example that helped me figure it out. Consider an RFC 822
email. A header is from the first line (1) to the first
blank line (/^$/). A body line is from that line until the
last line ($). Note that dollar ($) means "end of string"
in the RE and "last line" in the flip-flop.
$header .= $_ if 1 .. /^$/;
$body .= $_ if /^$/ .. $;
I've finally figured out the difference between .. and ...,
but don't have a good example. The bad (contrived) example
I have is below. It shows that the flip-flop could turn off
on the same line that turned it on.
#! /usr/bin/perl -w
while(<DATA>) {
next if /^$/; # Skip blank lines.
next if m/^\s*/; # Skip shell-style comments.
chomp;
$data .= $_ if /BEGIN/ ... /END/
}
__DATA__
# This is a multi-line data block.
BEGIN
Long data goes here.
It can span multiple lines.
The beginning and ending tags are on separate lines.
END
# This is a single-line data block.
BEGIN Short data can start/end on same line. END
__END__
--
Michael R. Wolf
All mammals learn by playing!
MichaelRunningWolf at att.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
POST TO: spug-list at pm.org PROBLEMS: owner-spug-list at pm.org
Subscriptions; Email to majordomo at pm.org: ACTION LIST EMAIL
Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
For daily traffic, use spug-list for LIST ; for weekly, spug-list-digest
Seattle Perl Users Group (SPUG) Home Page: http://seattleperl.org
More information about the spug-list
mailing list