Perl Newby has asked for the wisdom of the Perl Monks concerning the following question:

I have a text file that looks like the following:
CAUGHT STEALING 5602|Edgar Renteria|24|St. Louis Cardinals|1|3 PITCHING 24|St. Louis Cardinals 4379|Andy Benes|L, 2-2|0|6|8|3|3|0|0|1|24|31|41|72|4.41|.258 4625|Heathcliff Slocumb|0|0|1|0|0|0|0|0|0|4|3|8|11|4.08|.231 4979|Mike Mohler|0|0|1|0|0|0|1|3|0|4|8|9|17|8.79|.293 17|Cincinnati Reds 5346|Ron Villone|W, 3-1|0|6.2|5|2|2|3|4|2|28|42|59|101|4.73|.301 6174|Scott Williamson|SV, 2|0|2.1|2|0|0|0|3|0|9|10|25|35|2.53|.211 DOUBLE PLAYS 24|St. Louis Cardinals|2|Vina to Renteria to McGwire|Vina to Renteria
When I run this code I also get the DOUBLE PLAYS section. Is there a way for me to just get the pitching section?
open(INPUT,"c:/MLB_boxscore.TXT") or die "Can't open file"; print "<html><head><title>My page</title></head><body>"; print "<table>"; $pitching = 0; while(<INPUT>) { if($pitching) { last if /^[A-Z]+$/; chomp; @LS = (); push @LS, split('\|',$_); print "<tr>"; print "<td>" . $LS[$_] . "</td>" for (1..$#LS); print "</tr>"; } elsif(/^PITCHING/) { $pitching = 1} } print "</table></body></html>"; close INPUT;

Replies are listed 'Best First'.
Re: Parsing a Text File 2
by I0 (Priest) on Apr 12, 2001 at 03:16 UTC
    last if /^[A-Z ]+$/;#or
    last if /^[A-Z][^|]*$/;
Re: Parsing a Text File 2
by astanley (Beadle) on Apr 12, 2001 at 02:18 UTC
    you need to create more elsif's for each of the sections. A better solution would be to change the name of the $pitching variable to something like $insection to keep track of what section you are in. Then you can compare that to another variable to see if the section has changed since the last input line. IE:
    my $insection = ""; while (<INPUT>) { if (/^PITCHING/) { $insection="pitching" } if (/^DOUBLE\s+PLAYS/) { $insection="double plays" } if(defined($oldsection) && $insection ne $oldsection) { undef $oldsection; } elsif (defined($oldsection) && $insection eq $oldsection) { #print the HTML forms here } elsif ($insection && !defined($oldsection)) { $oldsection = $insection; next; } }
    there's probably a better way to do it - but this works. NOTE: You must add if statements for all headings you wish to stop at (following my example of the DOUBLE PLAYS match). HTH!

    -Adam Stanley
    Nethosters, Inc.