This doesn't explain your error message, but it does highlight a couple of problems with your code that could be a contributory factors.
#! perl -w
use strict;
my $args = { src=>'commit' };
if ($args->{err}) { print "There is a problem : $args->{err}\n"; }
if ($args->{src} eq "commit") {
print "I've got my sources!\n";
print "I'm committed!\n" if (!$args->{err});
}
__END__
# Output
C:\test>192192
I've got my sources!
I'm committed!
You''ll notice that there is no key 'err' defined in the hash, and that, "I'm commited" was printed.
If I modify this as follows:
#! perl -w
use strict;
my $args = { src=>'commit' };
if ( exists $args->{err} && $args->{err} ) { print "There is a problem
+ : $args->{err}\n"; }
if ($args->{src} eq "commit") {
print "I've got my sources!\n";
print "I'm committed!\n" if (!exists $args->{err} && !$args->{err}
+);
}
__END__
# Output
C:\test>192192
I've got my sources!
This time, the "I'm commited" wasn't printed!
The reason for this is autovivifcation. Even testing for the presence of a hash element if you do it in any other way than using exists. Even doing if (defined $args->{key}) {...} will cause the key to 'spring into existance'.
Another clue to your error message is that coding if ($somevar) is semantically similar to doing if ( $somevar ne '' ) and the test is probably translated as such by the compiler.
Changing your code to use exists key && key may make your warning go away.
I did have a thought that if the reference being shifted into $args is a bless'd reference, the source of the warning might lie outside your code in the blessing package, but my knowledge of Perl's OO stuff is still in it's infancy, so I can't add anything to the thought.
What's this about a "crooked mitre"? I'm good at woodwork! |