Bob Ackerman wrote:
>
> this one wins the prolix award of the solutions we have seen today.
> we dare a non-perl programmer to believe this could mean something.
> I'm not sure i believe it means whatever. especially (?)(.) - zero or one
> character followed by a character?
> followed by a non-greedy run of characters up to dot? something to lose
> sleep over, i think.
> and this is the beginner's list. geez. and that was only one line out of
> three.
sub current_weather_conditions {
my($weather) =
get('http://weather.noaa.gov/pub/data/forecasts/zone/oh/ohz021.txt');
($weather) or return('Today\'s weather conditions are currently
unavailable');
$weather =~ s/.*?\n\.[^.]*?\.{3}(.*?)\n\..*/$1/s;
$weather =~ tr/[A-Z]\n/[a-z] /;
$weather =~ s/( ?)(.)(.*?)\./$1\U$2\E$3\./g;
return($weather);
}
Actually its not too tough. Obviously get() stores the contents of the web
document in $weather. The current weather conditions is always the "first"
weather condition. Each forecast starts with a ( . ), has a string of
letters, then has three ( ... )'s followed by the forecast. This is the
delimiter for each "section" of weather forecasts.
I call the first forecast in the document the current weather, so I only
want the first forecast.
.*? matches all characters until the first \n\.[^.]*?\.{3}
\n\.[^.]*?\.{3} is the forecast delimiter. The first time in the string a
period follows a newline, then has some characters that are not periods,
then has three periods in a row.
Now I am sitting at the nothing in between a period and the first letter of
the current weather conditions, so I start to "record" the following text.
All the text from the first letter of the current weather conditions up to
the next period that follows a newline is captured. Then the .* is to match
the rest of the contents of the string. Then /$1/ replaces $weather with
the current weather conditions.
All the characters in the string are capitalized, so some formatting needs
done before I can send it to whereever it is heading. The next line
lowercases all characters and turns newlines into spaces. (Theres some
rookie mistakes in there, see the following post)
The last substution before the return capitalizes The first character in
each sentence. ( ?) matches and records to $1 the space in between every
sentence. The ? makes the space optional because The first sentence in
$weather has no space in front of it. then the (.) matches and records to
$2 any character. This is the first character in the sentence. The (.*?)\.
Matches and records to $3 all the characters up to the next period. Then
the right hand side of the substutution replaces the matched part of the
string with the (optional) space that was stored in $1, then turns on
uppercasing, then inserts $2, the first letter of each sentence, then turns
off uppercasing, then inserts the rest of the sentence, then puts a period
at the end of the sentence (The \ in front of the period dosent need to be
there. This was one of my first all-by-myself regexes, so ive learned alot
since then. I also would use +'s instead of *'s nowadays...) The g after
the / makes it so the right hand side of the regex is applied to every
string that matches the left hand side.
Im only half way through my CS bachelors, but I do want to teach this stuff
one day... How did I do with this?
Todd W.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]