On Wednesday 16 Dec 2009 16:57:01 Bryan R Harris wrote:
> [stuff cut out]
>
> >> For example, if I'm populating a complex variable @d with
> >> lots of pointers,
> >> hashes, arrays, etc. within, if I populate that within a
> >> subroutine, how do
> >> I get it back out conveniently without it making a whole
> >> nother copy of it
> >> outside? If it's 500 MB, isn't that horribly inefficient?
> >> Plus, I have to
> >> keep track of it.
> >
> > You pass as a refernce as ni
> > called_sub(\...@d);
> > Now when you update, you are updating @d and not a copy.
> >
> > If you have any questions and/or problems, please let me know.
> > Thanks.
> >
> > Wags ;)
> > David R. Wagner
>
> So let's say I pass a reference to an array:
>
> my @d = (1,2,3);
> called_sub(\...@d);
>
> ... but then in called_sub, accessing that gets a lot "noisier", right?
>
> sub called_sub {
> my $d = shift;
> push @{$d}, 2; # I'd rather be able to use @var instead of @{$var}
> }
>
> Is there any way to make a new variable, @something, that is just another
> name for the array that was passed in by reference? Since I'm building a
> complex data structure, having to include all those @{}'s can get annoying.
First of all, often just "@$d" instead of "@{$d}" will work too. This will
make things a little less noisy. Otherwise, you can try using perltie
(possibly not very recommended) to tie a regular variable into the reference.
Alternatively, you can use this module:
http://search.cpan.org/dist/Lexical-Alias/
Or another option I can think of is to create an object to wrap the operations
around the reference, and use methods on it:
<<<
my $d = MyArrayHandle->($d_param);
$d->push(@other_array);
>>>
TIMTOWTDY. And in Perl 6 one will be able to pass arrays as first-order
parameters to the subroutine.
>
> Also, if called_sub modifies that array that was passed in by reference,
> does it stay changed outside the subroutine? Or do I have to return
> something from the subroutine and capture it on the outside?
It stays changed outside the subroutine:
<<<<<<<<<<<<
#!/usr/bin/perl
use strict;
use warnings;
sub change_array_ref
{
my $a_ref = shift;
$a_ref->[5] = 5_000;
return;
}
my @array = (1 .. 10);
change_array_ref(\...@array);
print join(", ", @array), "\n";
>>>>>>>>>>>>
prints:
<<<<<<<<
1, 2, 3, 4, 5, 5000, 7, 8, 9, 10
>>>>>>>>
That's part of the point of references. If you're interested in having a
temporary variable, you can use a shallow copy ("[ @{$array_ref} ]") or a deep
copy - see perldoc Storable.
Regards,
Shlomi Fish
--
-----------------------------------------------------------------
Shlomi Fish http://www.shlomifish.org/
"Star Trek: We, the Living Dead" - http://shlom.in/st-wtld
Bzr is slower than Subversion in combination with Sourceforge.
( By: http://dazjorz.com/ )
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/