cvs commit: perlfaq perlfaq4.pod

[email protected]
Newsgroups perl.cvs.perlfaq
Message-ID <[email protected]>
cvsuser     02/05/20 09:45:46

  Modified:    .        perlfaq4.pod
  Log:
  ===> What's the difference between "delete" and "undef" with hashes?
  
  several glaring errors fixed:
  
  	* uses exists() correctly now
  
  	* use a consistent variable name
  
  	* does not call a hash an array
  
  i'll probably come back to provide a short answer for this
  question since i don't think we need so many words to
  explain the difference. :)
  
  ===> "Why don't my tied hashes make the defined/exists distinction?"
  
  	* removed mention of DEFINED() for tied hashes, since it
  	doesn't exist
  
  Revision  Changes    Path
  1.23      +36 -35    perlfaq/perlfaq4.pod
  
  Index: perlfaq4.pod
  ===================================================================
  RCS file: /cvs/public/perlfaq/perlfaq4.pod,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -w -r1.22 -r1.23
  --- perlfaq4.pod	16 May 2002 12:44:24 -0000	1.22
  +++ perlfaq4.pod	20 May 2002 16:45:46 -0000	1.23
  @@ -1,6 +1,6 @@
   =head1 NAME
   
  -perlfaq4 - Data Manipulation ($Revision: 1.22 $, $Date: 2002/05/16 12:44:24 $)
  +perlfaq4 - Data Manipulation ($Revision: 1.23 $, $Date: 2002/05/20 16:45:46 $)
   
   =head1 DESCRIPTION
   
  @@ -1707,15 +1707,17 @@
   
   =head2 What's the difference between "delete" and "undef" with hashes?
   
  -Hashes are 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 C<$key> is
  -present in the array, C<exists($key)> will return true.  The value for
  -a given key can be C<undef>, in which case C<$array{$key}> will be
  -C<undef> while C<$exists{$key}> will return true.  This corresponds to
  -(C<$key>, C<undef>) being in the hash.
  +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, C<exists($hash{$key})> will return true.  The value
  +for a given key can be C<undef>, in which case
  +C<$hash{$key}> will be C<undef> while C<exists $hash{$key}>
  +will return true.  This corresponds to (C<$key>, C<undef>)
  +being in the hash.
   
  -Pictures help...  here's the C<%ary> table:
  +Pictures help...  here's the %hash table:
   
   	  keys  values
   	+------+------+
  @@ -1727,16 +1729,16 @@
   
   And these conditions hold
   
  -	$ary{'a'}                       is true
  -	$ary{'d'}                       is false
  -	defined $ary{'d'}               is true
  -	defined $ary{'a'}               is true
  -	exists $ary{'a'}                is true (Perl5 only)
  -	grep ($_ eq 'a', keys %ary)     is true
  +	$hash{'a'}                       is true
  +	$hash{'d'}                       is false
  +	defined $hash{'d'}               is true
  +	defined $hash{'a'}               is true
  +	exists $hash{'a'}                is true (Perl5 only)
  +	grep ($_ eq 'a', keys %hash)     is true
   
   If you now say
   
  -	undef $ary{'a'}
  +	undef $hash{'a'}
   
   your table now reads:
   
  @@ -1751,18 +1753,18 @@
   
   and these conditions now hold; changes in caps:
   
  -	$ary{'a'}                       is FALSE
  -	$ary{'d'}                       is false
  -	defined $ary{'d'}               is true
  -	defined $ary{'a'}               is FALSE
  -	exists $ary{'a'}                is true (Perl5 only)
  -	grep ($_ eq 'a', keys %ary)     is true
  +	$hash{'a'}                       is FALSE
  +	$hash{'d'}                       is false
  +	defined $hash{'d'}               is true
  +	defined $hash{'a'}               is FALSE
  +	exists $hash{'a'}                is true (Perl5 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 $ary{'a'}
  +	delete $hash{'a'}
   
   your table now reads:
   
  @@ -1775,23 +1777,22 @@
   
   and these conditions now hold; changes in caps:
   
  -	$ary{'a'}                       is false
  -	$ary{'d'}                       is false
  -	defined $ary{'d'}               is true
  -	defined $ary{'a'}               is false
  -	exists $ary{'a'}                is FALSE (Perl5 only)
  -	grep ($_ eq 'a', keys %ary)     is FALSE
  +	$hash{'a'}                       is false
  +	$hash{'d'}                       is false
  +	defined $hash{'d'}               is true
  +	defined $hash{'a'}               is false
  +	exists $hash{'a'}                is FALSE (Perl5 only)
  +	grep ($_ eq 'a', keys %hash)     is FALSE
   
   See, the whole entry is gone!
   
   =head2 Why don't my tied hashes make the defined/exists distinction?
   
  -They may or may not implement the EXISTS() and DEFINED() methods
  -differently.  For example, there isn't the concept of undef with hashes
  -that are tied to DBM* files. This means the true/false tables above
  -will give different results when used on such a hash.  It also means
  -that exists and defined do the same thing with a DBM* file, and what
  -they end up doing is not what they do with ordinary hashes.
  +This depends on the tied hash's implementation of EXISTS().
  +For example, there isn't the concept of undef with hashes
  +that are tied to DBM* files. It also means that exists() and
  +defined() do the same thing with a DBM* file, and what they
  +end up doing is not what they do with ordinary hashes.
   
   =head2 How do I reset an each() operation part-way through?
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.