I'm writing a script that has to read from a binary file. Sometimes it has to read 1 byte, sometimes 4, sometimes 12. This seems ripe for a function, so I wrote one:

sub ReadBytes { my $num = shift; return undef if $num < 1; my @bytes; for (1..$num) { my $byte; read(BINFILE, $byte, 1); push @bytes, unpack("C",$byte); } return @bytes; }

The problem I have is that while I will always be reading from BINFILE in *this* script, this sub isn't very flexible and doesn't lend itself to code re-use (and therefore offends my sense of aesthetics). Further, since BINFILE is opened within another sub (ParseData, which does interesting things to the bytes I'm reading from BINFILE), I have ReadBytes embedded in ParseData. Nested subs are icky, in my book (there's that darned sense of aesthetics again), and there must be a better way to do it.

So my question is this: Just what is the Better Way To Do It?

Update: Passing the filehandle is just what I was looking for. For some reason I thought I'd have to tie it in some way - I forgot about passing a ref to the typeglob. Thanks all for your help!

"One word of warning: if you meet a bunch of Perl programmers on the bus or something, don't look them in the eye. They've been known to try to convert the young into Perl monks." - Frank Willison

In reply to Nested subs - inherently evil? by myocom

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.