Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

FAQ 4.61 What's the difference between "delete" and "undef" with hashes?

0 views
Skip to first unread message

PerlFAQ Server

unread,
May 26, 2008, 9:03:02 AM5/26/08
to
This is an excerpt from the latest version perlfaq4.pod, which
comes with the standard Perl distribution. These postings aim to
reduce the number of repeated questions as well as allow the community
to review and update the answers. The latest version of the complete
perlfaq is at http://faq.perl.org .

--------------------------------------------------------------------

4.61: What's the difference between "delete" and "undef" with hashes?

Hashes contain pairs of scalars: the first is the key, the second is the
value. The key will be coerced to a string, although the value can be
any kind of scalar: string, number, or reference. If a key $key is
present in %hash, "exists($hash{$key})" will return true. The value for
a given key can be "undef", in which case $hash{$key} will be "undef"
while "exists $hash{$key}" will return true. This corresponds to ($key,
"undef") being in the hash.

Pictures help... here's the %hash table:

keys values
+------+------+
| a | 3 |
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+

And these conditions hold

$hash{'a'} is true
$hash{'d'} is false
defined $hash{'d'} is true
defined $hash{'a'} is true
exists $hash{'a'} is true (Perl 5 only)
grep ($_ eq 'a', keys %hash) is true

If you now say

undef $hash{'a'}

your table now reads:

keys values
+------+------+
| a | undef|
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+

and these conditions now hold; changes in caps:

$hash{'a'} is FALSE
$hash{'d'} is false
defined $hash{'d'} is true
defined $hash{'a'} is FALSE
exists $hash{'a'} is true (Perl 5 only)
grep ($_ eq 'a', keys %hash) is true

Notice the last two: you have an undef value, but a defined key!

Now, consider this:

delete $hash{'a'}

your table now reads:

keys values
+------+------+
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+

and these conditions now hold; changes in caps:

$hash{'a'} is false
$hash{'d'} is false
defined $hash{'d'} is true
defined $hash{'a'} is false
exists $hash{'a'} is FALSE (Perl 5 only)
grep ($_ eq 'a', keys %hash) is FALSE

See, the whole entry is gone!

--------------------------------------------------------------------

The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
are not necessarily experts in every domain where Perl might show up,
so please include as much information as possible and relevant in any
corrections. The perlfaq-workers also don't have access to every
operating system or platform, so please include relevant details for
corrections to examples that do not work on particular platforms.
Working code is greatly appreciated.

If you'd like to help maintain the perlfaq, see the details in
perlfaq.pod.

Hans Mulder

unread,
Jun 8, 2008, 3:56:41 PM6/8/08
to
PerlFAQ Server wrote:

> 4.61: What's the difference between "delete" and "undef" with hashes?

[....]


> exists $hash{'a'} is true (Perl 5 only)

I think "Perl 5 only" here means "only if you use Perl 5.000 or later".

Most of the advice given in the FAQ doesn't work in Perl 4, but people
don't complain, because the readers of this newsgroup all switched to
Perl 5 long ago. So I propose to leave out this "Perl 5 only" note
(here and twice more in the same answer).

-- HansM

brian d foy

unread,
Jun 10, 2008, 12:08:41 PM6/10/08
to
In article <484c397b$0$14352$e4fe...@news.xs4all.nl>, Hans Mulder
<han...@xs4all.nl> wrote:

The "Perl 5 Only" isn't hurting anyone or distorting any information,
so I'll leave it in the answer. Beleive it or not, some people are
still using Perl 4. I run into it occassionally.

0 new messages