On Dec 4, 7:25 am, [EMAIL PROTECTED] (Ankur) wrote:
> Hi
>
> I am running the following code and receiving the warning :
>
> Use of uninitialized value in pattern match (m//) at a.pl line 15.
That is to be expected.
> a.pl :
> /
> **************************************************************************************/
> sub CommaFormatted{
> my $delimiter = ','; # replace comma if desired
> my($n,$d) = split /\./,shift,2;
> my @a = ();
> while($n =~ /\d\d\d\d/)
> {
> $n =~ s/(\d\d\d)$//;
> unshift @a,$1;
> }
> unshift @a,$n;
> $n = join $delimiter,@a;
> $n = "$n\.$d" if $d =~ /\d/;
> return $n;
>
> }
>
> print CommaFormatted(10000);
>
> /
> **************************************************************************************/
>
> Please help.
You are setting $d to be the second part of '10000' as delimited by
'.'.
There are no periods in '10000' so there's no such thing.
Therefore $d is set to the special undefined value. The pattern
matching operation operates on strings. The special undefined value is
not a string. It can be implicitly converted into a null string but
often needing to so this is a sign that something is wrong. That's
what the warning is saying. Actually the warning says 'uninitialized'
when it means 'undefined'. I have always considered this to be a bug
in Perl.
As it happens, even if there was a '.' as the last character in your
input string then you'd still get the same message. This is counter-
intuitive but is documented in the documentation of the split()
function.
You should explicitly check $d is defined or suppress this warning for
the duration of the pattern match
$n .= ".$d" if do { no warnings 'uninitialized'; $d =~ /
\d/ };
Actually I can't see why you do the pattern match at all...
$n .= ".$d" if defined $d;
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/