muir@cae780.csi.com (David Muir Sharnoff) (04/23/91)
I would like to use *foo = $bar'foo to "import" variables into
packages. However, I have a case where a variable seems to
loose its value and I want to know if my usage of aliasing
could be causing problems like the one I'm having.
So, my question is: what are the gotchas of the following code:
package baz;
*bar = *main'bar;
I never set *bar to anything else and I only run the above command
once.
If using type globbing like I've been using it is safe, then could
I use it to do fake structures: (the following code is off-the-cuff,
untried...)
package struct;
sub new
{
local($sd,$package) = @_;
local($sym);
unless (defined($symbol{$sd})) {
$sym = &gensym();
$symbol{$sd} = $sym;
$count{$sym} = 0;
$fields{$sym} = &uniq(sort(grep(s/[@$%]?(.)/$1/,split(' ',$sd))));
}
$sym = $symbol{$sd};
&get($sym.$count{$sym},$package);
return $sym.($count{$sym}++);
}
sub get
{
local($sym,$package);
local($e);
$package = 'main' unless $package;
$e = "package $package;\n";
for $f (split(/ /,$fields{$sym})) {
$e .= "*$f = *$sym'$f;\n";
}
eval $e;
warn $@ if $@;
}
sub all
{
local($sd) = @_;
local(@ret);
local($sym);
$sym = $symbol{$sd};
for ($i = 0; $i <= $count{$sym}; $i++) {
push(@ret,$sym.$i);
}
return @ret;
}
package foo;
$desc = '$a $b %c @c';
$str = &struct'new($desc,'foo');
$a = 1;
$str = &struct'new($desc,'foo');
$a = 2;
$str = &struct'new($desc,'foo');
$a = 3;
for $x (&struct'all($desc)) {
&struct'get($desc,'foo');
print "$a\n";
}
Thanks,
-Dave
--
David Muir Sharnoff. "RISC is about one year ahead"
muir@csi.com (415) 358-3664 (415) 644-0441
Comdisco Systems Inc. 919 East Hillsdale Blvd, Foster City, CA 94404