Dan Anderson wrote:
> I have a module that works with a couple of different file handles.  Is
> it possible to hide them within an anonymous hash?  {} (i.e. the objects
> data).  Right now I have:
>
> if (condition_is_met()) {
>   open("FILE","<file");
> }
>
> This is in the main body of my package (and thus, I assume, accessible
> by all functions).  Is it better to use tighter encapsulation (i.e. a
> closure or throwing it into an anonymous hash) or just to leave it in
> the body?

I think you'd be safe like this, except that if you have a lot of them
then you dont' know what the filehandle is going to be called. Here
you've used *Package::FILE, but there's no general way of getting to
that package name from any given filename. How about a hash of glob
references?

Here's a closure with a subroutine which keeps a list of handles for
each file it has already opened. The program just uses it to print
the next line from alternate files.

I hope this helps.

Rob


  use strict;
  use warnings;

  line_from ('filea');
  line_from ('fileb');

  line_from ('filea');
  line_from ('fileb');

  line_from ('filea');
  line_from ('fileb');

  {
    my %filehandle;
    my $fh;

    sub line_from {

      my $file = shift;

      $fh = $filehandle{$file};

      unless (defined $fh) {
        open $fh, $file or die $!;
        $filehandle{$file} = $fh;
      }

      print scalar <$fh>;
    }
  }




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to