[tpm] Weird arrary reference bahaviour
Indy Singh
indy at indigostar.com
Wed Oct 31 18:42:32 PDT 2007
From: "Cees Hek" <ceeshek at gmail.com>
To: "Indy Singh" <indy at indigostar.com>
Cc: <tpm at to.pm.org>
Sent: Wednesday, October 31, 2007 9:20 PM
Subject: Re: [tpm] Weird arrary reference bahaviour
> On 11/1/07, Indy Singh <indy at indigostar.com> wrote:
>> Hi Guys,
>> Can anyone explain, why taking a reference to an array gives a
>> different
>> value on each iteration of this loop. This is the line of code:
>> my $r = \@f;
>>
>> If I move the "my @a" declaration outside the loop I get the same
>> value
>> each time.
>>
>> It seems that on each iteration of the loop a new @f array is
>> created.
>> Does that make sense?
>>
>> Indy Singh
>> IndigoSTAR Software -- www.indigostar.com
>>
>>
>> my @foo = ("ford:ltd", "chevy:nova");
>> my $x;
>> my @a;
>>
>> foreach $x (@foo) {
>> my @f;
>> @f = split(/:/, $x);
>> my $r = \@f;
>> print "r = $r\n";
>> push @a, $r;
>> }
>
> At the end of each iteration of the loop, @f falls out of scope. But
> since you store away a reference to \@f, the data that @f refers to
> does not get garbage collected (ie it's refcount has not hit zero).
> So during the next iteration of the loop, the memory location that @f
> used during the previous iteration is not available to be re-used, so
> a new location is assigned to @f.
>
> if you didn't store that reference to @f, then the data would be
> garbage collected (ie @f goes out of scope at the end of the
> iteration, the refcount is zero and the memory is reclaimed), and Perl
> would re-use the same memory location for @f for each iteration.
>
> Cheers,
>
> Cees
> At the end of each iteration of the loop, @f falls out of scope.
I would have thought that @f falls out of scope _after_ the closing
brace, not while still inside it. But you seem to be right.
More information about the toronto-pm
mailing list