..., 0.3, 0.58, 0.2, ... #### 20 #### 20 20 #### #!/usr/bin/perl use strict; use warnings; my @probs; { local $/; @probs = split " ", ; } my $segs = get_ranges( sub { return ( $_[0] > 0.5 ) }, \@probs ); print "$_\n" for ( @$segs ); sub get_ranges { my ( $cmp, $list ) = @_; my @ranges = (); my @current_range = (); my $endpoint = 0; for ( 0 .. $#$list ) { if ( $cmp->( $$list[$_] )) { $current_range[$endpoint] = $_; $endpoint = 1; } elsif ( @current_range ) { push @ranges, "@current_range"; @current_range = (); $endpoint = 0; } } return \@ranges; } __DATA__ 0 0.1 0.53 0.51 0.59 0.67 0.2 0.04 0.05 0.56 0.89 0.75 0.3 0.58 0.25