OK inspecting only the glob reveals it's existence in the stash:
No, I don't think so. open my $fh creates a GLOB that is not in any STASH and stores a reference to it in $fh. It also places a name in that STAB in case somebody dumps it. You can achieve similar end results using the old technique of pure Perl:
my $fh = do { local *FH; \*FH };
But I really doubt that 'open my $fh' goes to such lengths. It just creates a disembodied GLOB w/ a name filled in.
#!/usr/bin/perl -l
print 'before: ', join ' ', keys %foo::;
my $fh;
{
package foo;
open $fh, '<-' or die $!;
}
print 'after opened $fh: ', join ' ', keys %foo::;
*{ 'foo::$bar' } = \'bar';
print 'created *$bar: ', join ' ', keys %foo::;
print 'foo::$bar = ', ${'foo::$bar'};
{
package foo;
our $bar;
open $bar, '<-' or die $!;
print 'foo::$bar = ', ${'foo::$bar'};
print 'foo::bar = ', ${'foo::bar'};
print 'after $bar: ', join ' ', keys %foo::;
}
eval q{
package foo;
local *baz = \'baz';
};
print 'after local *baz: ', join ' ', keys %foo::;
__END__
before: bar
after opened $fh: bar
created *$bar: bar $bar
foo::$bar = bar
foo::$bar = bar
foo::bar = GLOB(0x4f824c)
after $bar: bar $bar
after local *baz: bar baz $bar