Perl Operator pitfalls

Perl operator pitfalls

Be sure to get familar with the difference between   and // in perl code.
my $value = do_something() || 1;

What’s wrong with this? Possibly nothing, maybe everything.

Let’s assume something different:

sub my_sub {
        my $value = shift || 1;
        return $value + 1;
    }

    print my_sub();
    print my_sub(0);
    print my_sub(1);

So let’s guess what is the output of this?

If you are suprised to get three times the same result “2” here is what you possibly wanted:

sub my_sub {
         my $value = shift // 1;
         return $value + 1;
    }

The reason for this behaviour is that perl evaluates only three things as false in boolean context:

  • 0 or '0'
  • Empty values as "" or ()
  • undef

And as || actually is an or with other precedence it will evaluate everything in boolean context. What you realy want is an if undef like operator. And exactly this does the // operator above.

See man perlop for details.

blog comments powered by Disqus
Posted at by toke