Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^3: Tidy up conditions

by SuicideJunkie (Vicar)
on Mar 19, 2015 at 20:09 UTC ( [id://1120652]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Tidy up conditions
in thread Tidy up conditions

my %hash = (0=>'that was false', ''=>'oops false too', 42=>'So very true');

The first two keys there evaluate to false, and would cause a problem with the code.

Replies are listed 'Best First'.
Re^4: Tidy up conditions
by tel2 (Pilgrim) on Mar 19, 2015 at 23:50 UTC
    OK - thanks SJ,

    I had thought that when Martin said "boolean false values", he literally meant hash values, as opposed to hash keys, which is why I questioned it, but I guess he meant values in the more general sense (i.e. keys in this case).

      Actually, I did mean values and not hash keys. Here is an example of how boolean false values would defeat our intent to short-cut at the first match:
      my %access = ('foo' => 0, 'bar' => 123); print $access{'foo'} || $access{'bar'}; # prints 123
      The key 'foo' exists but the zero score makes perl evaluate the second operand, too. With perl version 5.10.0 and up, the defined-or operator can help, as it short-cuts only on undef:
      my %access = ('foo' => 0, 'bar' => 123); print $access{'foo'} // $access{'bar'}; # prints 0
      Older perls don't have this operator, however.
        Hi again Martin,

        I've incorporated the // in my code like this:

        $item = 'Test'; $level = $access{$item} // ($item =~ /^([^:]+):/ && $access{"$1:*"}) // $access{'*'} // 999; print "level='$level'\n";
        Unfortunately, when the regex doesn't match, it seems to short-circuit, and this is printed:
        level=''

        Any ideas why? I assume it's something to do with the line which contains the regex not being 'defined', but I'm not sure.

        Meanwhile, I've worked around it by putting the regex first, like this:

        $access{'*'} = 30; $item = 'Test'; $item =~ /^([^:]+):/; $level = $access{$item} // $access{"$1:*"}) // $access{'*'} // 999; print "level='$level'\n";
        And I think that's working (i.e. it prints "level='30'" in the above case).
        If you've got a better adjustment to this code, which doesn't involve using that regex unless needed, I'd love to see it.  Otherwise, no worries - I'm pretty happy.

        Thanks again.

        Well said, Martin!

        Good thing I'm using v5.10.1.

        I'd never seen the // operator.
        I'm so glad I asked...and you answered.

        Tel2
        (Another satisified PerlMonks shopper)
        PS: Give yourself a pay rise, could ya?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1120652]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (5)
As of 2024-04-24 08:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found