Fileopening question
tamaguchi
created: 2006-04-03 05:32:01
Is it possible to open files without knowing what the filenames are? Suppose I would like to open any file that is a .txt file forexample? Thank you for any help.
Re: Fileopening question
created: 2006-04-03 05:41:14

This is the sort of thing I usually use for such purposes. Note this is recursive and therefore will search subdirectories also. :-)

#!/usr/bin/perl -w
# Recurse directories to find .txt files

use strict;
use File::Find;

my $file = '';
my $dir  = '';

@ARGV = qw(.) unless @ARGV; # current dir unless otherwise specified

$dir = shift @ARGV;

sub process_file {
           return unless -f;        #skip directories
           $file = $_;
           local @ARGV = ($file);
           if ($file =~ m/\.(txt)/si) {
               # do stuff here
	       } 
}

find(\&process_file, $dir);

HTH,

planetscape
Re: Fileopening question
created: 2006-04-03 05:56:13

[planetscape] gave the complete answer, here's a simpler option without recursiveness, using [doc://glob]:

for my $filename (glob("*.txt")) {
  next if (!-f $filename);
  open(my $fh,"<",$filename) or die "Can't open $filename for reading";
  #...process file
}

All dogma is stupid.
Re: Fileopening question
created: 2006-04-03 07:41:16
Since you are taking "general purpose", here is a little routine that handles a commonly appearing problem now-a-days, where your encoding can't handle special (but legal) characters in filenames. It won't affect anything, if the filenames are normal ascii, but will fix them, so Perl can find them from the filesystem, if there is a unicode character in them. I was shown this, when I had a problem opening files with Perl, which had names like Claude Gellée , where the funny é is actually an acented e. See [id://537023]
 #this decode utf8 routine is used so filenames with extended 
   # ascii characters (unicode) in filenames, will work properly 
   use Encode;
   opendir my $dh, $path or warn "Error: $!";
   my @files = grep !/^\.\.?$/, readdir $dh;
   closedir $dh;
   # @files = map{ "$path/".$_ } sort @files; 
   #$_ = decode( 'utf8', $_ ) for ( @files ); 
   @files = map { decode( 'utf8', "$path/".$_  ) } sort @files;



I'm not really a human, but I play one on earth. flash japh
Re: Fileopening question
created: 2006-04-03 11:26:11
use glob function.

Regards,
Murugesan Kandasamy
use perl for(;;);

perlmonks.org content © perlmonks.org and murugu, planetscape, tamaguchi, tirwhan, zentara

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03