in reply to Stashing a Package Variable by Reference
${ *{${ns} . '::foo'} } = $cram;
You could also write
${ $::{$ns.'::'}{foo} } = $cram;
in which case you wouldn't need the no strict 'refs'.
#!/usr/bin/perl -l use strict; use warnings; my $ns = 'Teddy::'; ${ $::{$ns}{foo} } = 'cheese'; print '$Teddy::foo: ', $Teddy::foo; # or the other way round $Teddy::foo = 'bar'; print '${ $::{$ns}{foo} }: ', ${ $::{$ns}{foo} }; __END__ $Teddy::foo: cheese ${ $::{$ns}{foo} }: bar
The main stash %:: holds an entry 'Teddy::', whose value is the stash of that package (or more precisely, a glob whose hash part is the stash). The latter holds an entry 'foo', whose value is a glob, the scalar slot of which you can select with ${ ... }
print grep /Teddy/, keys %::; # Teddy:: print $::{'Teddy::'}; # *main::Teddy:: print keys %{$::{'Teddy::'}}; # foo print $::{'Teddy::'}{foo}; # *Teddy::foo
P.S.: you could also put a direct reference to a string 'cheese' in the scalar
slot of the glob, in which case you would get a kind of read-only variable:
$::{'Teddy::'}{foo} = \'cheese'; print $Teddy::foo; # cheese $Teddy::foo = 'bar'; # "Modification of a read-only value attempted a +t ..."
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Stashing a Package Variable by Reference
by Xiong (Hermit) on May 30, 2010 at 17:19 UTC | |
by almut (Canon) on May 30, 2010 at 18:54 UTC | |
by Xiong (Hermit) on May 31, 2010 at 20:27 UTC | |
by almut (Canon) on May 31, 2010 at 21:32 UTC | |
by ikegami (Patriarch) on May 31, 2010 at 20:38 UTC | |
by bart (Canon) on May 31, 2010 at 20:39 UTC | |
by almut (Canon) on May 31, 2010 at 22:16 UTC | |
by bart (Canon) on Jun 01, 2010 at 09:25 UTC | |
|