I currently use the following Perl to check if a variable is defined and contains text. I have to check defined
first to avoid an 'uninitialized value' warning:
if (defined $name && length $name > 0) { # do something with $name }
Is there a better (presumably more concise) way to write this?
Perl | defined() FunctionDefined() in Perl returns true if the provided variable 'VAR' has a value other than the undef value, or it checks the value of $_ if VAR is not specified. This can be used with many functions to detect for the failure of operation since they return undef if there was a problem.
Perl doesn't offer a way to check whether or not a variable has been initialized. However, scalar variables that haven't been explicitly initialized with some value happen to have the value of undef by default.
You often see the check for definedness so you don't have to deal with the warning for using an undef value (and in Perl 5.10 it tells you the offending variable):
Use of uninitialized value $name in ...
So, to get around this warning, people come up with all sorts of code, and that code starts to look like an important part of the solution rather than the bubble gum and duct tape that it is. Sometimes, it's better to show what you are doing by explicitly turning off the warning that you are trying to avoid:
{ no warnings 'uninitialized'; if( length $name ) { ... } }
In other cases, use some sort of null value instead of the data. With Perl 5.10's defined-or operator, you can give length
an explicit empty string (defined, and give back zero length) instead of the variable that will trigger the warning:
use 5.010; if( length( $name // '' ) ) { ... }
In Perl 5.12, it's a bit easier because length
on an undefined value also returns undefined. That might seem like a bit of silliness, but that pleases the mathematician I might have wanted to be. That doesn't issue a warning, which is the reason this question exists.
use 5.012; use warnings; my $name; if( length $name ) { # no warning ... }
As mobrule indicates, you could use the following instead for a small savings:
if (defined $name && $name ne '') { # do something with $name }
You could ditch the defined check and get something even shorter, e.g.:
if ($name ne '') { # do something with $name }
But in the case where $name
is not defined, although the logic flow will work just as intended, if you are using warnings
(and you should be), then you'll get the following admonishment:
Use of uninitialized value in string ne
So, if there's a chance that $name
might not be defined, you really do need to check for definedness first and foremost in order to avoid that warning. As Sinan Ünür points out, you can use Scalar::MoreUtils to get code that does exactly that (checks for definedness, then checks for zero length) out of the box, via the empty()
method:
use Scalar::MoreUtils qw(empty); if(not empty($name)) { # do something with $name }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With