On 4/4/06, Lawrence Statton <[EMAIL PROTECTED]> wrote:
> > Is there a nice clean perl way to test to see if only one key of a hash
> > has data?
> >
> > %some_hash = ( key1 => 1, key2 => 2 ); should fail the test
> > %some_hash = ( key2 => 2 ); should pass the test
> > %some_hash = ( key1 => 1 ); should pass the test
> > %some_hash = ( key1 => 1, key2 => 2, key3 => 3 ); should fail the test
> > %some_hash = ( key2 => 2 ); should pass the test
> > %some_hash = ( key1 => 1 ); should pass the test
> > %some_hash = ( key2 => 2, key3 => 3 ); should pass the test
> > %some_hash = ( key1 => 1, key3 => 3 ); should pass the test
> >
> > Basically I can many more keys in the hash but two of the keys have to
> > be exclusive.
> >
>
> You really could have said that a LOT better...  It took several
> re-readings, and finally "what's the difference between test-cases 1,
> 7 and 8?" to understand what you meant.
>
> How 'bout
>
> Given a hash %hash with many keys ( qw / key1 key2 key3 keyn / )
> how do I test that only one of the values $hash{key1} or $hash{key2} are 
> defined?
>
> if ( exists $hash{key1} and exists $hash{key2}  ) {
>    warn "fail";
> } else {
>    warn "succeed";
> }


You've said two differnt things here, though, and they may be
important to the OP, although he hasn't been very clear. If you want
to know whether a value is defined, you don't use exists, you use
defined. Consider

    #!/usr/bin/perl

    use warnings;
    use strict;

    my %hash = (
                0 => 0,
                1 => 1,
                2 => 2,
                3 => undef,
                4 => ''
                );

    foreach my $key (keys %hash) {
        print "key $key ";
        print "exists" if exists $hash{$key};
        print ", is defined" if defined $hash{$key};
        print ", is true" if $hash{$key};
        print "\n";
    }

    print "2 & 3 both exist\n" if exists $hash{2} && exists $hash{3};
    print "2 & 3 aren't both defined\n" unless defined $hash{2} &&
defined $hash{3};
    print "2 & 3 aren't both true\n" unless $hash{2} && $hash{3};
    print "5 didn't even come to the party\n" unless exists $hash{5};

The first step is for OP to decide what question he really wants to
ask about his data.

HTH,

-- jay
--------------------------------------------------
This email and attachment(s): [  ] blogable; [ x ] ask first; [  ]
private and confidential

daggerquill [at] gmail [dot] com
http://www.tuaw.com  http://www.dpguru.com  http://www.engatiki.org

values of β will give rise to dom!

Reply via email to