Hi Chris,

Chris Wagner <[EMAIL PROTECTED]> wrote:
> At 01:28 AM 5/3/2006 -0400, David Kaufman wrote:
>> my ($b, $c) = ($1, $2) if $a =~ /^(\D+)(\d+)/;
> 
> U can't combine a my and an if.  Perl will go schizo.

Sure "U" can :-) I use this type of construct all the time, even with strict 
mode and warnings on.  What you mean by "perl will go schizo"?

What *will* happen is that, if $a doesn't match the regex, $b and $c will be 
undefined.  But I use this in cases, like the original poster's, where the 
regex is expected to always match.  In such cases an error has already occurred 
so any subsequent "Use of uninitialized value" warnings will warn me that the 
string contained something it was never supposed to contain.

If you're not so trusting of the source string, and you want to be absolutely 
sure that your string matched before continuing, or would just prefer a more 
explicit error if it ever does not, you can test for the undefinedness of $b 
and $c right after the assignment:

my ($b, $c) = ($1, $2) if $a =~ /^(\D+)(\d+)/;
unless (defined($b) and defined($c)) {
  die '$a was not a series of letters followed by a series of numbers!!';
}

but I'd usually use the idiom above to *save* those extra three lines, as I 
said, when I am reasonably confident that the string will indeed match.  If I'm 
not, thess three lines (mentioned elsewhere in the thread) would do the same 
job, and be quite a bit more obvious to whoever reads the code in the future:

my ($b, $c);
if ($a =~ /^(\D+)(\d+)/) { ($b, $c) = ($1, $2) }
else {die '$a was not a series of letters followed by a series of numbers!!' }

-dave (not really always a code-compacting zealot, but sometimes less is more!)

_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to