title: Extracting specific data from text file in Perl
body: <p>I am new to Perl and am trying to extract specific data from a file, which looks like this:</p>
  
  <pre><code> Print of   9 heaviest strained elements:    
  
  
     Element no   Max strain 
        20004         9.6 % 
        20013         0.5 % 
        11189         0.1 % 
        20207         0.1 % 
        11157         0.1 % 
        11183         0.0 % 
        10665         0.0 % 
        20182         0.0 % 
        11160         0.0 % 
  
  
   ==================================================
  </code></pre>
  
  <p>I would like to extract the element numbers only (20004, 20013 etc.) and write these to a new file. The reading of the file should end as soon as the line (=========) is reached, as there are more element numbers with the same heading later on in the file.
  Hope that makes sense.
  Any advice much appreciated! </p>
  
  <p>I now have this code, which gives me a list of the numbers, maximum 10 in a row:</p>
  
  <pre><code>my $StrainOut = "PFP_elem"."_$loadComb"."_"."$i";
  open DATAOUT, "&gt;$StrainOut" or die "can't open $StrainOut";  # Open the file for writing.
  
  open my $in, '&lt;', "$POSTout" or die "Unable to open file: $!\n";
  my $count = 0;
  
   while(my $line = &lt;$in&gt;) {
    last if $line =~ / ={10}\s*/;
    if ($line =~ /% *$/) {
      my @columns = split "         ", $line;
      $count++;
      if($count % 10 == 0) {
        print DATAOUT "$columns[1]\n";
      }
      else {
        print DATAOUT "$columns[1] ";
      }      
    }
  }
  close (DATAOUT);
  close $in;
  </code></pre>
  
  <p>What needs changing is the "my @columns = split..." line. At the moment it splits up the $line scalar whenever it has '9 spaces'. As the number of digits of the element numbers can vary, this is a poor way of extracting the data. Is it possible to just read from left to right, omitting all spaces and recording numbers only until the numbers are followed by more spaces (that way the percentage value is ignored)?</p>