in reply to Matching next line in text file

The variable $stn is the current hash you are building up. When you encounter a /^H/ or /^reclin/ or the end of input, you want to save that hash to your array and reset it:
my $stn; # current stn hash being constructed ... while (<IN>) { if (/^H/ || /^reclin/i) { if ($stn) { ...save $stn...; $stn = undef; # reset stn hash } } if (/^H/ ... /[<\[]/) { ... same code ... } next if (/^reclin/i); ... parse new $stn hash values ... $stn->{$s} = [ $x, $y, $z ]; } if ($stn) { ...save $stn... }

Replies are listed 'Best First'.
Re^2: Matching next line in text file
by YYCseismic (Beadle) on Jul 03, 2008 at 20:30 UTC

    I don't know if that's quite what I want.

    I'm building a couple of hashes on the fly here. One of them holds station ID as keys and arrays of station coordinates as values. This I've called %stn. When I reach the next SEG-P1 header block, I want to save this %stn hash into another hash that I've called %seg (see code sample in original question).

    But I also want to be able to save this when there is no header block between data sets. An example of this is the data sample of Case 2 above.

    After all this saving is done (I also need to put the header array @hdr into the %seg hash), I want to empty the station hash (%stn) and the header array so that they can accept the next data set.

    Also, I tried the $stn->{$s} syntax, and it didn't work. I got the error that $stn wasn't part of a package (I hadn't declared it lexically -- rather, I had declared it lexically as a hash, not a scalar, variable).

      I made $stn a hash ref because this isn't going to work:

      $seg{$lname} = { 'header' => \@hdr, 'stations' => \%stn, };
      You'll find that the header will always point to the same array. The same will be true for stations - all of them will be the same hash.

      However, if you make the stn hash a hash ref, then this will work:

      # time to save stn and headers: $seg{$lname} = { header => [ @hdr ], stations => $stn }; @hdr = () $stn = undef;
      Note the square brackets around @hdr - this will create a new array.