in reply to find the continuity in the data file

This isn't particularly difficult from an algorithm perspective, but you've made the rookie mistake of giving us no examples of what you want for input settings or output data and then expecting us to magically divine the answer. I'm just going to +1 the decent answers here and move on.
  • Comment on Re: find the continuity in the data file

Replies are listed 'Best First'.
Re^2: find the continuity in the data file
by extrem (Initiate) on Feb 05, 2012 at 11:11 UTC

    i tried doing this but i get an error

    #!/usr/bin/perl -w use strict; use warnings; # program identifies if the number series contains > 2500 continuo +us numbers # read this number series into a arr1 # if (length < 2500) # then ,discrad # else { # for (i=1 to $len) # idenitfy the indices where there are breaks and # store these indices into arr2 # foreach element in this @arr2 # if the difference in the indices > 2500 # then take the diff and print the range use Data::Dumper; my @files = </Users/distance/8A/*>; foreach my $file (@files){ my $file = $ARGV[0]; open INFILE," $file" or die "$!\n"; <INFILE>; <INFILE>; my @arr1 = <INFILE>; close INFILE; my $len = scalar(@arr1) ; print "$len\n" ; my (@range, %h, @numbers); if ($len < 2500) { print "no use of searching\n" ; } else { my $last_line = $#arr1; my ($range_start, $range_end) = ('', ''); for (my $i = $last_line; $i > 0; $i--) { my $line = $arr1[$i]; if ($line =~ /t:\s*(\d+)/) { push(@numbers, $1); } } } if (scalar @numbers){ for (my $i = 0; $i< scalar(@numbers); $i++){ last if ($i+1 > $#numbers); my $f = $numbers[$i]; my $s = $numbers[$i+1]; if ($f - $s == 1) { $h{s} = $f if (!$h{s}); $h{e} = $s; }else{ push(@range, [[$h{e}, $h{s}]]); $h{s} = 0; $h{e} = 0; # can be updated to any number to get all the ranges # for now gives only two ranges last if (scalar @range == 2); } } } # in case its only one range if ($h{s} && $h{e} && !scalar(@range)) { push (@range, [$h{e}, $h{s}]); } print Dumper \@range; }
    i get an error as= Use of uninitialized value $file in concatenation (.) or string at test.pl line 31
      "Use of uninitialized value" is a warning, not an error. Line 31 of your posted program is
      close INFILE;
      so you are probably running a different version of the code.
      Another suspicious thing is your open: do you really prepend a space to the argument?

      Can you explain this portion?

      <INFILE>; <INFILE>; my @arr1 = <INFILE>; close INFILE;
      From the context, I'm assuming your files have two header lines and then one number per line.

      use strict; use warnings; for (rangeOver(*DATA, 4)) { print "$_->[0] to $_->[1] = " . ($_->[1] - $_->[0] + 1) . "\n"; } sub rangeOver { my ($fh, $min) = @_; my ($start, $end, @ranges, $i); <$fh>; <$fh>; chomp(@_ = <$fh>); return [] if $#_ < $min - 1; $start = $end = shift; for (@_) { if ($_ == $end + 1) { $end++; next; } push @ranges, [$start, $end] if $end >= $start + $min - 1; $start = $end = $_; } push @ranges, [$start, $end] if $end >= $start + $min - 1; return @ranges; } __DATA__ some header 1 3 4 5 6 8 10 11 12 13 14