in reply to Unintialised value?

Nobody seems to have mentioned this, but you should be using exists to check for the existance of a hash key. In your example code, every key that has been brought into existance has been initialized with a value of 1. So one obvious potential problem is that you're checking for value in a key that doesn't exist. Hense, you get the warning about an uninitialized value. Is this a surprise? This is exactly what the exists function is for.

my % pages = ( 'index' => 1, 'me' => 1, 'stuff' => 1, 'links' => 1 ); my $page = shift; exit 0 unless exists $pages{$page} and $pages{$page} == 1;

This will not generate the uninitialized value warning, because the right hand side equality test only gets evaluated if the left side of the logical short-circuit 'and' evaluates to truth first (if the hash key exists).

If you happen to be in a situation where the key might exist but without any initialized value, you could chain a defined in there...

exit 0 unless exists $pages{$page} and defined $pages{$page} and $pages{$page} == 1;

Not terribly elegant, but it does take into consideration all the possibilities.


Dave

Replies are listed 'Best First'.
Re: Re: Unintialised value?
by Not_a_Number (Prior) on Jan 25, 2004 at 19:37 UTC
    exit 0 unless exists $pages{$page} and defined $pages{$page} and $pages{$page} == 1;

    Is the exists test really necessary here? Shouldn't the test for defined suffice? In my (admittedly limited :-) experience, a perl variable that is defined necessarily exists, so:

    exit 0 unless defined $pages{$page} and $pages{$page} == 1;

    should suffice.

    But perhaps I'm missing something, and you can show some instance where both tests are needed?

    TIA

    dave

      Is the exists test really necessary here?

      Well, it depends. There are four things that a hash element can be (in a simple world). True, False, Undefined, or Nonexistant.

      I consider it at least bad style, and a bad habbit to get into, to use defined to test hash elements that may not even exist. Yes, you will not get a warning for doing so. But let's keep things clear; does a key exist or not, is it defined or not, is its value true or not?

      Consider the following:

      | * * * V a l u e s * * * Evaluation | 1 or 'X' | 0 or '' | undef | nonexistant -----------+-----------+---------+-------+------------- boolean | True | False | False | False defined | True | True | False | False exists | True | True | True | False

      So the only way to be sure whether you're looking at an undefined element, versus a nonexistant element, is to use exists. If you don't care whether it exists or not, only whether or not it's got a value, use defined, but in the example the OP gave us, he seemed to want to exit if a hash element didn't exist, and exists is the right thing for that job. I find it best to not be ambiguous about things that may bite me later.


      Dave