in reply to Nested subs - inherently evil?

Ignoring error handling, I'd probably do it something like this:
sub ReadBytes { local $file = shift; my $num = shift; my $input; read($file, $input, $num); return unpack("C$num", $input); }
Note that the filehandle is "local" and not "my". Call this as ReadBytes(*BINFILE, 12); You could also localize a typeglob and then use the filehandle directly.

HTH, --traveler

Replies are listed 'Best First'.
Re: Re: Nested subs - inherently evil?
by chromatic (Archbishop) on Feb 11, 2002 at 21:05 UTC
    Note that the filehandle is "local" and not "my".
    What is the purpose of this?

    Localizing a typeglob (let us be accurate here: what we call a "filehandle" is a typeglob from which Perl automagically extracts the IO slot) temporarily makes a different referent available by the same name. This is handy for avoiding conflicts elsewhere.

    The alternative to your construct, using a lexical to contain a glob reference is also automagically understood by Perl and is, of course, lexically scoped.

    At the risk of severe understatement, local is designed to allow scoped modifications of global names. It produces no special magic for filehandles (with the appropriate understanding that there is severe magic in perlio that doesn't apply here).

    In other words, you can do it this way, but I can't see where it does you any good, since the standard approach does the same thing more idiomatically.

      This results from my initially localizing the glob itself as in:
      sub foo { local *FH = shift; ... read FH, ... }
      I realized it was more straightforward to use $whatever, but neglected to change the local to a my.

      --traveler