http://www.perlmonks.org?node_id=667599


in reply to Re^5: Is this DBM::Deep behavior, or something with tie/bless? (ref)
in thread Is this DBM::Deep behavior, or something with tie/bless?

So just fix Data::Compare. The fixes would probably be quite simple. The best fix is to change such things to:
if( ! eval { @$requires; 1 } ) { # Can't be used as an array ref
It is fine to use ref as a Boolean test. Any other uses of ref I simply can't recommend.

Note that the above trick doesn't work for CODE references so you have to resort to one of the second-best methods. I'd use the following:

Wouldn't that give a useless use warning? I would suggest this instead, which also works for CODE.
if( ! eval { \@$requires } ) { # Can't be used as an array ref
Pre-perl 5.10, either has a problem with arrayrefs being able to be dereferenced as pseudo-hashes.

Replies are listed 'Best First'.
Re^7: Is this DBM::Deep behavior, or something with tie/bless? (ref)
by tye (Sage) on Feb 12, 2008 at 16:50 UTC

    Yes, I have an open bug against Data::Diver for issuing warnings about pseudo-hashes due to this.

    You are right about the other warnings as well. Unfortunately, your alternative has other problems:

    my $foo; if( eval { \@$foo } ) { print $foo, $/; } __END__ ARRAY(0x34d10)

    In the case of CODE ref testing, there is a different problem:

    my $foo= "not_a_code_reference"; print "oops!\n" if eval { \&$foo };

    Of course, in some situations, one could consider the latter a feature. But mostly I think it would be unwanted.

    It is very sad that Perl still doesn't provide decent tools for determine the data type(s) of a reference. It is no wonder nobody gets this right.

    - tye