use strict; my $input_file = 'foobar.txt'; open my $in, $input_file or die "Failed to read $input_file: $!\n"; my @max = do { local $_ = <$in>; chomp; [ split ] }; my $last = $max[ 0 ][ 1 ]; while ( <$in> ) { chomp; my ( $x, $y ) = split; if ( $y > $last ) { $max[ -1 ] = [ $x, $y ]; } elsif ( $max[ -1 ] ) { $max[ @max ] = undef; } $last = $y; } close $in; pop @max unless $max[ -1 ]; print "Maxima:\n"; print "($_->[ 0 ], $_->[ 1 ])\n" for @max;
For data that is not x-ordered, use the following:
use strict; my $input_file = 'foobar.txt'; open my $in, $input_file or die "Failed to read $input_file: $!\n"; my @data; while (<$in>) { chomp; push @data, [ split ]; } close $in; @data = sort { $a->[ 0 ] <=> $b->[ 0 ] } @data; my @max = $data[ 0 ]; my $last = $max[ 0 ][ 1 ]; for ( 1 .. $#data ) { my ( $x, $y ) = @{ $data[ $_ ] }; if ( $y > $last ) { $max[ -1 ] = [ $x, $y ]; } elsif ( $max[ -1 ] ) { $max[ @max ] = undef; } $last = $y; } pop @max unless $max[ -1 ]; print "Maxima:\n"; print "($_->[ 0 ], $_->[ 1 ])\n" for @max;
Update: fixed missing my before $in
the lowliest monk
In reply to Re^5: Any idea for predicting the peak points in the graph by perl
by tlm
in thread Any idea for predicting the peak points in the graph by perl
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |