chen li am Sonntag, 28. Mai 2006 00.56:
[...]
> Thank you all for the reply.
>
>
> Based on what I learn the regular method to defer a
> hash reference to get specific value takes this
> format:
>
> $ref_hash->{key1}

yes, if $ref_hash is a hash reference, you get the value associated to the 
key 'key1'.

Try the following script, it shows you the structure of $ref_hash. If you are 
ever unclear of the structure of a variable, use Data::Dumper to inspect it. 
As you can note in the output, the definition is exactly the same as in line 
[1] (apart from the order and the variable name).

#!/usr/bin/perl

use strict; use warnings;

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]

use Data::Dumper;
print Data::Dumper::Dumper $ref_hash;


> but in this line
> $_[0]->{_name}= $_[1] if defined $_[1]
>
> the format is
> array element->{_name}

yes, because the array element $_[0] (the first element in the array @_) 
consists of a hash reference, and the -> operator accesses this hash 
reference.

At the point the -> operator does it's work, the fact that the hash reference 
is part of an array is no more relevant.

Compare the following script with the above one - the output is exactly the 
same.

#!/usr/bin/perl

use strict; use warnings;

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]
my @arr=($ref_hash); # array with one element: a hash ref

use Data::Dumper;
print Data::Dumper::Dumper $arr[0];


> Is the middle man $ref_hash is omitted in this format?
>
> Does this what Perl really sees:
>
> $_[0]=$ref_hash;
> $ref_hash->{_name};
> and put these two lines into one line to make it short:
> $_[0]->{_name}

More ore less. I'd say: You call the name() method of your object $obj (I call 
it $obj, not $ref_hash, to make clear its not only a hash reference, but a 
hash reference blessed into a class, that means: a perl object) with

  my $name_of_the_object=$obj->name;

This means, that $obj is passed to the name method as first argument. This 
first argument is passed in the @_ array, in the first position, wich is 
$_[0].

The name() method uses this $obj (and its attribute _name) by the line

   $_[0]->{_name}


Run the third script:

#!/usr/bin/perl

use strict; use warnings;

### Demo 1:

my $ref_hash={key1=>'value1', key2=>'value2'}; # [1]
my @arr=($ref_hash); # array with one element: a hash ref

if ($ref_hash == $arr[0]) {
   print '$ref_hash and $arr[0] are the same', "\n",
      "they have the addresses '$ref_hash' and '$arr[0]'\n\n\n";
}

### Demo 2;

package My;

sub new{
   my $class=shift;
   print "The class name is '$class'\n";
   return bless [EMAIL PROTECTED], $class
};

sub name {
   print "\$_[0] has address '$_[0]'\n";
   my $self=shift;
   print "\$self has address '$self'\n";
   return $self->{_name}
}

my $obj=My->new(_name=>'myname');
print "\$obj has address '$obj'\n";

print 'The name is `', $obj->name, "`\n";

>

Have a look into the perl documentation. You get an overview of it by typing

   perldoc perl

at the command line. Look for "objects", "data structure" etc.

Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to