views:

86

answers:

3

I have a few log files like these:

  • /var/log/pureftpd.log
  • /var/log/pureftpd.log-20100328
  • /var/log/pureftpd.log-20100322

Is it possible to load all of them into a single filehandle or will I need to load each of them separately?

+1  A: 

You could use pipes to virtually concat these files to a single one.

codymanix
Thanks, that was the keyword I was looking for.
rarbox
+4  A: 

One ugly hack would be this:

local @ARGV = qw(
    /var/log/pureftpd.log 
    /var/log/pureftpd.log-20100328 
    /var/log/pureftpd.log-20100322
);

while(<>) {
    # do something with $_;
}
Leon Timmermans
Use the special `ARGV` filehandle to implicitly open on each file in @ARGV.
Pedro Silva
This is what I do. I wouldn't call it "ugly", but it's not beautiful either.
brian d foy
Well, the reason it's "ugly" is because it's fragile: any other part of your code (or someone else's) can break this code by munging `@ARGV`. For for a quick one-off script, it's fine.
Ryan Thompson
+1  A: 

It's not terribly hard to do the same thing with a different filehandle for each file:

foreach my $file ( @ARGV )
    {
    open my($fh), '<', $file or do { warn '...'; next };
    while( <$fh> )
         {
         ...
         }
    }
brian d foy