in reply to opening consecutive files

Rather than trying to open 30 files when some or all of them may not exist, and dieing if one of them doesn't (unless that makes sense). You could let perl tell you which files exist and just open those that do.

while( my $file = <graph_set_*.out> ) { next unless $file =~ m[graph_set_[123]?[0-9].out]; open IN, '<', $file or warn "Couldn't open file $file because $!"; #Do stuff close IN; }

The caveat is that you may not get the files in the order you want them if that is important. They will be in sorted order (as of 5.8 I think) but as your numbers don't appear to have leading zeros, they will come in ascii order 1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 24 25 26 27 28 29 3 30 4 5 6 7 8 9

If that's a problem, then you could do

for $file (sort{ $a=~/(\d+)/ <=> $b=~/(\d+)/ } <graph_set_*.out> ) { open... .... close... }

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"When I'm working on a problem, I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong." -Richard Buckminster Fuller


Replies are listed 'Best First'.
Re: Re: opening consecutive files
by harry34 (Sexton) on Jun 27, 2003 at 13:57 UTC
    there is nothing printing into the txt file.
    is there anything obviously wrong ?
    I know the pattern matching code is right.
    #!/usr/local/bin/perl while( my $file = <graph_set_*.out> ) { next unless $file =~ m[graph_set_[123]?[0-9].out]; open IN, '<', $file or warn "Couldn't open file $file because $!"; local $/ = undef; # undef record seperator my $string = <IN>; # read whole file into string close IN; } my @gset_match = ($string =~ /([A-Z]\s\d+,\s\d+\(\s*\d+\))/g); open (TEXT, ">graph_set.txt") or die "Can't create graph_set.txt: $!\n +"; foreach $_(@gset_match) { print TEXT "$_\n"; } close TEXT;
      Had you turned on strict, Perl would have told you that where you match $string that variable is out of scope. What you do is, in a loop, read in each file, store the context in a lexical variable (which is gone at the next iteration of the loop). Then, outside the loop, after discarding the content of all the files, you do the matching.

      But there's nothing to match against.

      Abigail