jettero has asked for the wisdom of the Perl Monks concerning the following question:

I have a huge array that I wish to transport to another namespace without copying it.

I could simply set @OtherNamespace::Ar = @HA, but that makes a copy and I'd prefer that if Ar gets modified that HA would get modified also. I know you can issue a *ON::Ar = *HA to link them together, but my problem is that my huge array is really an array-ref in a big hash structure...

Is there a way to link $HugeArrayRef to @ON::Ar like with the glob you can use for arrays?

UPDATE: Just use a ref to your huge data structure. Pretend I don't have access to the OtherNameSpace, but still need to set that array to call a function there. I'm trying to avoid this:

@ON::Ar = @{$myvar->{ar}}; $blessed->function; @{$myvar->{ar}} = @ON:Ar;

UPDATE2: I'm embarrassed that *ON::Ar = $myvar->{ar}; is apparently what I wanted. It's always something simple when you spend a long time on it. Data::Alias and Data::Bind are interesting though, so it's not a total loss. Thanks.

-Paul

Replies are listed 'Best First'.
Re: namespace hacking with globs
by Corion (Patriarch) on Jan 15, 2008 at 12:27 UTC

    Just assign the reference to the array slot of the glob:

    my $ref = $some->{huge}->[42]->{arrayref}; *ON::Ar = $ref; print for @ON::Ar;

    You might also want to consider Data::Alias.

Re: namespace hacking with globs
by ikegami (Patriarch) on Jan 15, 2008 at 12:44 UTC
    Two ways to alias a package variable to another variable:
    local *ON::Ar = $myvar->{ar}; $blessed->function;
    use Data::Alias qw( alias ); alias @ON::Ar = @{$myvar->{ar}}; $blessed->function;
Re: namespace hacking with globs
by lodin (Hermit) on Jan 15, 2008 at 12:24 UTC

    I think you're looking for

    *ON::Ar = $HugeArrayRef
    The way it works is that it sets *ON::Ar{ARRAY} to be $HugeArrayRef. Thus $HugeArrayRef is now de facto the array that @ON::Ar represents. There's more about this in perldata (see e.g. "Typeglobs and Filehandles") and perlref for *foo{THING}.

    lodin

Re: namespace hacking with globs
by moritz (Cardinal) on Jan 15, 2008 at 12:22 UTC
    Just use a ref to your huge data structure.

    Or go to CPAN and try Data::Bind or Data::Alias or the like.

Re: namespace hacking with globs
by jbert (Priest) on Jan 15, 2008 at 13:29 UTC
    Perhaps do it the other way?

    Take a reference to the array in the other namespace, and fill that up.

    my $ar = \@OtherNameSpace::Ar; doTheThingWhichPopulatesBigArray($ar);
    That way you've still only got one copy of the data.