> > my $fh = do { local *_ };
>
> That doesn't do anything useful either. My guess is that Perl will
> attempt to stringify the typeglob and put something like
> qw( *package::_ ) into $x.
You sure? Somebody once told me to use
my $fh = do { local *FH };
because local saves the previous value and then as the last statement
in the block returns the blank glob. Seemed wierd, but has always
worked without file collisions.
> If you've got this:
>
> my $fh = do { local *_ };
> open $fh, $file;
>
> then you will be opening the file on a _very_ oddly-named
> handle. Try opening and reading from two files at once in the
> same way!
okay.
File "a":
=========
a1
a2
a3
a4
a5
File "b":
=========
b1
b2
b3
b4
b5
File "tst":
===========
my $f1 = do { local *_ };
my $f2 = do { local *_ };
open $f1, "a" or die $!;
open $f2, "b" or die $!;
print scalar <$f1>;
print scalar <$f2>;
print scalar <$f1>;
print scalar <$f2>;
print scalar <$f1>;
print scalar <$f2>;
print scalar <$f1>;
print scalar <$f2>;
output of command "perl -w tst":
================================
a1
b1
a2
b2
a3
b3
a4
b4
Works fine.
As it was explained to me, the return value from do { local *_ } is the
purely temporary *local* version of the glob, which is stored in the
lexical and used as the filehandle.
However, if I take those lines out of the file and add
my ($f1,$f2);
to declare them, it still works fine. Surprise!
I could swear I tried that before and had an error, but maybe it was
back before we upgraded to 5.6. Anybody out there still got a pre-5.6
Perl to test this on?
The wierd thing is that
my $x = do { local *_ };
print "$x\n";
yields
*main::_
even though the above example proves that the version returned isn't in
conflict. Spooky. :)
> If you have this instead:
> my $fh = do { local *_; \*_ };
> open $fh, $file;
> then you are making $fh a reference to a typeglob, which can
> be used in place of a real typeglob in most places (if not
> everywhere?). However, what this does:
Agreed, though the local() statement returns the glob as well, and a
reference to a glob is more precise, but seldom necessary from what
I've seen.
> open my $fh, $file;
>
> is to autovivify a typeglob for you and set $fh to a reference
> to it, so you get the same effect. In only one line!
Wait a sec -- my() uses lexical scratchpad variables, doesn't it?
I was under the impression that they didn't exactly use typeglobs. You
can't have a lexical format, can you? Or is that also bogus and/or
obsolete info?
> > which can be passed to things that are expecting a filehandle, and
> > NOT a plain scalar.
>
> Well you can pass a scalar, but this is the same sin as using
> symbolic references.
Implicitly, it *is* a symbolic ref, isn't it? Unless the scalar value
has a glob in it?
Both versions of the code I ran above were happy when run under strict,
which I know won't let you use symrefs, which is why I thought it
didn't use to work anyway..... I wrote code that way so it would work
under strict. Now it appears that workaround isn't necessary anymore!
> If you pass a plain scalar as a filehandle you will be
> specifying the filehandle by _name_. Should be safe though, as long
> as it's something obscure like *main::_ :-D
LOL!!! >:0P
__________________________________________________
Do you Yahoo!?
Yahoo! Shopping - Send Flowers for Valentine's Day
http://shopping.yahoo.com
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]