Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Perl, how can I concisely check if a $variable is defined and contains a non zero length string?

Tags:

string

perl

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?

like image 794
Jessica Avatar asked Sep 26 '09 00:09

Jessica


People also ask

How do I check if a variable is defined in Perl?

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.

How do you check if a variable is uninitialized in Perl?

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.


2 Answers

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     ...     } 
like image 113
brian d foy Avatar answered Sep 23 '22 22:09

brian d foy


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  } 
like image 43
Adam Bellaire Avatar answered Sep 23 '22 22:09

Adam Bellaire