views:

213

answers:

5

I've just been using this code to check if a string is empty:

if ($str == "")
{
  // ...
}

And also the same with the not equals operator...

if ($str != "")
{
  // ...
}

This seems to work (I think), but I'm not sure it's the correct way, or if there are any unforeseen drawbacks. Something just doesn't feel right about it.

+13  A: 

For string comparisons in Perl, use eq or ne:

if ($str eq "")
{
  // ...
}

The == and != operators are numeric comparison operators. They will attempt to convert both operands to integers before comparing them.

See the perlop man page for more information.

Greg Hewgill
Yea, using this though you need to be cautious that if it is undef, and if you're using warnings you'll get a runtime warning. Many ways to get around the warning though.
Evan Carroll
A: 

The very concept of a "proper" way to do anything, apart from using CPAN, is non existent in Perl.

Anyways those are numeric operators, you should use

if($foo eq "")

or

if(length($foo) == 0)
whatsisname
It's true that Perl doesn't tend to advocate the "one true way" towards problem solving, but that doesn't mean that there aren't strongly preferred idioms and styles and approaches. Also, as one of the Perl regulars likes to say a lot, even if there is more than one way to do things, *some* ways to do things are really, really bad (stupid, ill-advised, hard-to-maintain, etc.)
Telemachus
Just because there are many ways to do it does not mean that all ways are equal. Testing for empty strings using `if ($foo == "")`, for example, is *definitively wrong* unless you actually mean to be testing for whether `$foo`, evaluated in numeric context, has a value of 0 (in which case it would *still* be better written as `if ($foo == 0)`, as that more clearly expresses your intent).
Dave Sherohman
+2  A: 

You probably want to use "eq" instead of "==". If you worry about some edge cases you may also want to check for undefined:

if (not defined $str) {

# this variable is undefined

}
DmitryK
+8  A: 

As already mentioned by several people, eq is the right operator here.

If you use warnings; in your script, you'll get warnings about this (and many other useful things); I'd recommend use strict; as well.

Matthew Slattery
+1 Cool, yeah I normally use `use strict` but I'm updating some old code, so when I add this I get hundreds of errors. I'll probably fix them some day.
nbolton
+15  A: 
  1. Due to the way that strings are stored in Perl, getting the length of a string is optimized.
    if (length $str) is a good way of checking that a string is non-empty.

  2. If you're in a situation where you haven't already guarded against undef, then the catch-all for "non-empty" that won't warn is if (defined $str and length $str).

hobbs
I think that length is the closest test that we have to the expression of the idea that there is nothing in the string.
brian d foy