[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
change ni * protos
Could you please remind me why you intentionally broke
use strict;
sub fn(*) { my $fh = shift; print $fh "Boo!\n" }
*SNEAK = *STDOUT;
fn(SNEAK);
In _54, this was fine, because the prototype caused the function
to receive *SNEAK instead of 'SNEAK' as an argument. Now, it just
gets a bareword string, which seems to defeat the purpose of the
prototype. Typeglob protos used to be documented as follows (in
Camel II):
And a * does whatever it has to do to turn the argument into a
reference to a symbol table entry. It's typically used for
filehandles.
But they are now documented in perlsub(1) like this:
A * allows the subroutine to accept a bareword, constant, scalar
expression, typeglob, or a reference to a typeglob in that slot.
The value will be available to the subroutine either as a simple
scalar, or (in the latter two cases) as a reference to the
typeglob.
I don't understand the win. Now every function that hopes to use
this a filehandle passed in has to pull in Symbol::qualify_to_ref(),
or do the equivalent work. That means the function that used to
say
my $fh = shift;
must now say:
use Symbol;
my $fh = Symbol::qualify_to_ref(shift, caller);
There are other subtle problems, too. If you don't lock it in right
away, you're doomed. You can't do anything useful with that value,
like storing it into a data structure or passing it to another
function, without doing the Symbol::qualify_to_ref() thing on the
value first. You'd lose the critical caller info otherwise. This
was never a concern when you had a real typeglob, and now it is.
It's bad enough that it breaks old code; in fact, this is *not* in
the release notes as a code-breaking incompatibility, but needs to
be! Perhaps worse still, I can't see how this is an advantage. It
also to my eye causes a lot more work than we ever had to go through
before. What is the purpose? I don't understand. I'm sure you
had a good reason, but I am not seeing it.
Thank you,
--tom
#########################
# This file:
#########################
use strict;
$|=1;
package Fab;
sub ululation(*) {
my $fh = shift;
print $fh "this went out $fh\n"
or warn "failed to print to fh $fh: $!\n";
}
package main;
print "testing *STDOUT...."; Fab::ululation(*STDOUT);
print "testing *stdout...."; Fab::ululation(*stdout);
print "testing *STDOUT{IO}...."; Fab::ululation(*STDOUT{IO});
print "testing *stdout{IO}...."; Fab::ululation(*stdout{IO});
print "testing STDOUT...."; Fab::ululation(STDOUT);
print "testing stdout...."; Fab::ululation(stdout);
print "testing *snigglebottom...."; Fab::ululation(*snigglebottom);
print "testing *snigglebottom{IO}...."; Fab::ululation(*snigglebottom{IO});
print "testing snigglebottom...."; Fab::ululation(snigglebottom);
__END__
#########################
# Produced this in _54:
#########################
testing *STDOUT....this went out GLOB(0x8dc18)
testing *stdout....this went out GLOB(0x8dc3c)
testing *STDOUT{IO}....this went out GLOB(0x8d054)
testing *stdout{IO}....this went out GLOB(0x8d054)
testing STDOUT....this went out GLOB(0x8dc18)
testing stdout....this went out GLOB(0x8dc3c)
testing *snigglebottom....failed to print to fh GLOB(0x9b4b4): Bad file descriptor
testing *snigglebottom{IO}....Can't use an undefined value as a symbol reference at /tmp/globtest line 26.
############################
# But produced this in _63:
############################
testing *STDOUT....this went out GLOB(0xa5490)
testing *stdout....this went out GLOB(0xa54b4)
testing *STDOUT{IO}....this went out IO::Handle=IO(0xa54a8)
testing *stdout{IO}....this went out IO::Handle=IO(0xa54a8)
testing STDOUT....Can't use string ("STDOUT") as a symbol ref while "strict refs" in use at /tmp/globtest line 9.
- Follow-Ups from:
-
Gurusamy Sarathy <gsar@ActiveState.com>
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]