http://www.perlmonks.org?node_id=1013816


in reply to Perl starter with questions about processing data from a txt file

Just remember the C value everytime, but only report it when needed:
#!/usr/bin/perl use warnings; use strict; open my $IN, '<', 'test.txt' or die $!; my $remember; while (<$IN>) { my @columns = split /\t/; print "$remember\n" if $columns[3] > 1e-3; $remember = $columns[2]; }
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
  • Comment on Re: Perl starter with questions about processing data from a txt file
  • Download Code

Replies are listed 'Best First'.
Re^2: Perl starter with questions about processing data from a txt file
by willperl (Initiate) on Jan 17, 2013 at 17:29 UTC

    Thanks! it worked but I am now confused. The code really listed the C value before D > 1e-3. But if I am understanding the code right, shouldn't Perl only report C values when D is > 1e-3 (that being said, I get Cn value instead of Cn-1)?

    And if I have multiple D values larger than 1e-3, can I ask perl to report only the first Cn-1 value to me, instead of listing all?

    Thanks again for any insights or answers!
      The code reports the remembered value when D > 1e-3, to the actual C value. As it is, it will report all the values. If you want to report only the first one, just exit the loop via last after printing a value. If you want to skip values that are on the neighbouring lines, just set a flag once you output a value, clear it otherwise, and only report a value if the flag is not set.
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
        Thanks choroba! I played with the code and understand what you meant by saying "remembered" value. Still trying the "last" perl function but when I added it instead of giving me only one result my code returned nothing... Thanks again for your help!
        Oops~~ I added some conditions after the last command and was able to exit the while loop using last as recommended. Thanks again choroba!