in reply to Check on if statement

Even without the problem of recognising an empty string, since you're using a regular expression, it will recognise any string which contains a question mark (even if it's got other characters in the string).

what's wrong with brute force?

if ($foo eq '' || $foo eq '?') { do something; }

--
Tommy
Too stupid to live.
Too stubborn to die.

Replies are listed 'Best First'.
Re: Re: Check on if statement
by Anonymous Monk on Aug 17, 2002 at 19:51 UTC
    Interesting ... "what's wrong with brute force?" Would two "eq" actually be more efficient then one "=~" ? It's probably splitting hairs, but it got me thinking .... Carl

      Well, my first thought was simply to write something that was simple, and not to worry about the speed. It depends on how many tens of million times this is going to happen before the speed even becomes an issue.

      However, since you asked:

      use Benchmark; $a="Hello"; timethese(10_000_000, { eq => sub { return ($a eq "" || $a eq "?") }, regexp => sub { $a=~/^\??$/ } } );
      gives
      Benchmark: timing 10000000 iterations of eq, regexp... eq: 7 wallclock secs ( 3.51 usr + -0.01 sys = 3.50 CPU) @ 28 +57142.86/s (n=10000000) regexp: 22 wallclock secs (10.15 usr + 0.13 sys = 10.28 CPU) @ 97 +2762.65/s (n=10000000)
      The figures don't change (significantly) when $a="?". When it's an empty string, the equality takes half the time (since the second equality is never used), and the regexp is slightly slower (because it has to backtrack). undef makes both slightly slower.

      --
      Tommy
      Too stupid to live.
      Too stubborn to die.

      In this case it would be more efficient because the AM who posted wants to check for either no value or a single question mark, if he/she wanted to check to see if the string was empty or a question mark anywhere in $foo then you would probably need something like
      if(!$foo || $foo =~ /\?/){ # either its blank or there is a ? somewhere in it }
        if(!$foo || $foo =~ /\?/){ # either its blank or there is a ? somewhere in it }
        actually, that would read: # it is blank, '0' or there is a '?' somewhere in it