in reply to Re: find the continuity in the data file
in thread find the continuity in the data file

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

Replies are listed 'Best First'.
Re^3: find the continuity in the data file
by choroba (Cardinal) on Feb 05, 2012 at 11:35 UTC
    "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?
Re^3: find the continuity in the data file
by Anonymous Monk on Feb 05, 2012 at 12:19 UTC

    Can you explain this portion?

    <INFILE>; <INFILE>; my @arr1 = <INFILE>; close INFILE;
Re^3: find the continuity in the data file
by TJPride (Pilgrim) on Feb 05, 2012 at 17:08 UTC
    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