I think you *intended* to burn off the lines as Scott7477 said; you are just missing the code to read the lines. Try this:

if ( /1tally\s\s(\d+)\s+nps\s=/i ) { foreach ( 1 .. 5 ) { my $junk = <OUT>; } next; }
Similarly, inside the "for (my $ij = 0; $ij < 98; $ij++) {...}" loop, you do not read any lines into $_, so you reprocess the same line 98 times. Add the line "$_ = <OUT>;" inside the loop, or use this next technique to keep from having to know the number of data lines ahead of time.

Another technique: When I want to skip the first part of a file, and the *last* line to be skipped can be matched by a regex, my preferred idiom is to use a skipping while-loop followed by a processing while-loop. You can also exit the processing while-loop if the file has a footer you need to skip. For example:

while (<OUT>) { last if /^\s+energy\n$/; } while (<OUT>) { last if /^\s+total\s+\d/; /\s\s\s(\d+)\.(\d+)(\D+)(\d+)\s\s\s(\d+)\.(\d+)(\D+)(\d+)\s(\d+)\.(\ +d+)/ or warn "This line did not match the pattern: '$_'" and next; $energy_value = $1.$dot.$2.$3.$4; #... }

Other problems in your code:

  1. Your first line reads #!usr/bin/perl. There should be a slash between the exclamation mark and 'usr'.
  2. You don't have to use the filehandle OUT just because your filename is in a variable named $out_file. Change it to something like IN, or you will confuse your future maintenance programmers.
  3. All your tests to see if $_ is true, such as next unless $_; will *always* return true due to the trailing newline. Try this instead: next unless /\S/;
  4. In the pattern /\s\s\s(\d+).(\d+)(\D+)(\d+)\s\s\s(\d+).(\d+)(\D+)(\d+)\s(\d+).(\d+)/i, you do not need the "ignore-case" modifier, but you do need to back-whack your periods, and you probably should anchor the pattern at the beginning and the end. Corrected: /^\s*\s\s\s(\d+)\.(\d+)(\D+)(\d+)\s\s\s(\d+)\.(\d+)(\D+)(\d+)\s(\d+)\.(\d+)\s*$/
  5. That pattern, and the next three lines, could be simplified to this: my ($energy_value, $detector_value, $std_deviation) = /^\s*\s\s\s(\d+\.\d+E[-+]\d+)\s\s\s(\d+\.\d+E[-+]\d+)\s(\d+\.\d+)\s*$/;
  6. You have no way to distinguish between a line you should skip, and a line you should have processed but failed to due to some possible problem with your pattern; such lines will be *silently* *omitted*, and incorrect output will appear to be correct with no indication of the problem. See "another technique" above for a method that offers tighter control.
  7. You are not using strict or warnings. You will come to regret this!


In reply to Re: Reading column data from a file by Util
in thread Reading column data from a file by pattobw

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.