${ *{${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 ..."
In reply to Re: Stashing a Package Variable by Reference
by almut
in thread Stashing a Package Variable by Reference
by Xiong
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |