У него никогда не было возможности преуспеть из-за
while(<USEDHAIL>){
my $hailCheck = $_;
if( $toBeChecked eq $hailCheck){
$found += 1;
}else{
return; ### XXX
}
}
При первом несовпадении саб возвращается к своему вызывающему. Возможно, вы имели в виду next
вместо этого, но для краткости вы должны удалить целое предложение else
. Удалите другой else { return; }
(соответствует тому, когда $found
имеет значение true) по той же причине.
Обратите внимание, что ваш алгоритм имеет квадратичную сложность и будет медленным для больших входных данных. Было бы лучше прочитать использованные записи в хэш, а затем для каждой строки CHECKHAIL
проверять хэш %used
, чтобы увидеть, обработан ли он.
С удалением этих строк я получаю
$ ./prog.pl
2305 200 2 S SISKIYOU GREENVIEW CA 41.52 -122.9 2 INCH HAIL REPORTED WITH STORM JUST SOUTH OF GREENVIEW. (MFR)
2350 200 DANIELS E FLAXVILLE MT 48.8 -105.17 GOLF BALL TO HEN EGG SIZED HAIL (GGW)
2350 175 5 N DANIELS RICHLAND MT 48.89 -106.05 DESTROYED CROPS (GGW)
Как вы можете видеть, это все еще имеет ошибку. Вам нужно перематывать USEDHAIL
для каждой строки CHECKHAIL
:
seek USEDHAIL, 0, 0 or die "$0: seek: $!";
while(<USEDHAIL>){
...
Это производит
$ ./prog.pl
2350 200 DANIELS E FLAXVILLE MT 48.8 -105.17 GOLF BALL TO HEN EGG SIZED HAIL (GGW)
2350 175 5 N DANIELS RICHLAND MT 48.89 -106.05 DESTROYED CROPS (GGW)
В качестве примера лучшего способа сделать это рассмотрим
#! /usr/bin/perl
use warnings;
use strict;
sub read_used_hail {
my($path) = @_;
my %used;
open my $fh, "<", $path or die "$0: open $path: $!";
local $" = " "; # " fix Stack Overflow highlighting
while (<$fh>) {
chomp;
my @f = split " ", $_, 10;
next unless @f;
++$used{"@f"};
}
wantarray ? %used : \%used;
}
my %used = read_used_hail "used-hail";
open my $check, "<", "check-hail" or die "$0: open: $!";
while (<$check>) {
chomp;
my @f = split " ", $_, 10;
next if !@f || $used{join " " => @f};
print $_, "\n";
}
Пример прогона:
$ ./prog.pl
2350 200 DANIELS E FLAXVILLE MT 48.8 -105.17 GOLF BALL TO HEN EGG SIZED HAIL (GGW)
2350 175 5 N DANIELS RICHLAND MT 48.89 -106.05 DESTROYED CROPS (GGW)