Luke Bakken wrote:
>>> use strict;
>>>
>>> my $str = 'AAAA1111';
>>> matchit();
>>> $str = '!!!!!!!!';
>>> matchit();
>>>
>>> sub matchit
>>> {
>>> if (length $str == 8) {
>>> $str =~ /^(\D+)(\d+)$/;
>>> print "\$1 $1 \$2 $2\n";
>>> }
>>> }
>>>
>> There is one potential problem with this algorithm, which is
>> that you aren't checking to make sure that the string actually
>> matches your regex. This can result in $1 and $2 containing
>> the values from the last string that worked instead of being
>> blank or failing, which can be hard to track down when you
>> start getting different values than what you expected.
>
> Maybe you're used to some old behavior in Perl, but that doesn't
> appear to be the case in 5.8.8 at least. I get this output:
The code works because $1 and $2 are being recreated within their
{} block. Removing them from {} will show that on a failed match,
they retain their previous value; the code below:
use strict;
my $str = '';
$str = 'AAAA1111';
$str =~ /^(\D+)(\d+)$/;
print "\$1 $1 \$2 $2\n";
$str = '!!!!!!!!';
$str =~ /^(\D+)(\d+)$/;
print "\$1 $1 \$2 $2\n";
produces the following output:
$1 AAAA $2 1111
$1 AAAA $2 1111
--Suresh
_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs