[prev in list] [next in list] [prev in thread] [next in thread] 

List:       perl-win32-users
Subject:    RE: learning references/dereferencing (understand $,@,%, but trouble	understanding &)
From:       Brian Raven <BRaven () nyx ! com>
Date:       2012-12-21 10:49:15
Message-ID: BEC7430227BFCA48BA8B43AE4B0593073C9354A2 () PB5COEXM01 ! europe ! NYX ! com
[Download RAW message or body]

From: perl-win32-users-bounces@listserv.ActiveState.com \
                [mailto:perl-win32-users-bounces@listserv.ActiveState.com] On Behalf \
                Of Greg Aiken
Sent: 20 December 2012 22:31
To: Perl-Win32-Users@listserv.ActiveState.com
Subject: learning references/dereferencing (understand $,@,%, but trouble \
understanding &)

> #if one desires to pass a scalar reference into a sub-routine,
> #the easiest way to assign a local scalar to the contents of the scalar reference \
> is...

Depends. Sometimes it is easier store the reference locally, and dereference as \
needed. See below.

> subroutine(\$scalar);
> sub subroutine {
> my $subroutine_scalar = ${$_[0]};  #note you need the {} brackets, or this doesn't \
> work! print "$subroutine_scalar\n";

   my $ref = shift;
   print "$$ref\n";

> }
> 
> #if one desires to pass an array reference into a sub-routine,
> #the easiest way to assign a local array to the contents of the array reference \
> is... subroutine(\@array);
> sub subroutine {
> my @subroutine_array = @{$_[0]};  #note you need the {} brackets, or this doesn't \
> work! print "in subroutine: " . join(' ', @subroutine_array) . "\n";

   my $ref = shift;
   print "in subroutine: @$ref\n";
   print "   first entry is $ref->[0]\n";

> }
> 
> #if one desires to pass a hash reference into a sub-routine,
> #the easiest way to assign a local hash to the contents of the hash reference is...
> subroutine(\%hash);
> sub subroutine {
> my %subroutine_hash = %{$_[0]};  #note you need the {} brackets, or this doesn't \
> work! print "in subroutine: " . join(' ', keys (%subroutine_hash)) . "\n";

   my $ref = shift;
   print "$_ = $ref->{$_}\n" foreach keys %$ref;

> }
> 
> all above works fine and is easy for me to understand.  its below that im having \
> difficulty with... 
> #seeing the 'pattern' of behavior for $, @, % variable types...
> #i, not knowing any better, assumed the same should also be able to be done for & \
> (subroutines) #i therefore tried a test to see if i could assign a new subroutine \
> to equal a de-referenced subroutine reference
> #i literally copied the same code as used above, but used the & operator instead of \
> ($, @, %) #this did not give the expected result...  perl reported:
> #hello CODE(0x237dbc)
> #Can't modify non-lvalue subroutine call at D:\_junk\TEST.PL line 6.
> 
> sub subroutine {
> print "hello @_\n"
> }
> sub2(\&subroutine);
> sub sub2 {
> &sub3 = &{$_[0]};  #problem is obviously here with this line, seems its not being \
> dereference sub3('world');

The only variable types are scalar array and hash. There is no subroutine variable \
type, but you can store a reference to a subroutine, which is a scalar, in a \
variable. You dereference it when you want to call it.

    my $ref = shift;
    $ref->('world');

> }

For more detail see 'perldoc perlref'

HTH


--
Brian Raven





________________________________

Please consider the environment before printing this e-mail.

This e-mail may contain confidential and/or privileged information. If you are not \
the intended recipient or have received this e-mail in error, please advise the \
sender immediately by reply e-mail and delete this message and any attachments \
without retaining a copy.

Any unauthorised copying, disclosure or distribution of the material in this e-mail \
is strictly forbidden. _______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic