Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

namespace hacking with globs

by jettero (Monsignor)
on Jan 15, 2008 at 12:17 UTC ( #662451=perlquestion: print w/replies, xml ) Need Help??

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 (Pope) 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 (Pope) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://662451]
Approved by almut
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2021-05-18 02:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Perl 7 will be out ...





    Results (171 votes). Check out past polls.

    Notices?