Вы должны use warnings
вместо использования -w
.
Причина, по которой он жалуется, состоит в том, что в первый раз, когда вы встречаетесь с определенным днем, $dates{$this_date}
равен undef
(потому что он никогда не был установлен),Разделение, которое дает вам предупреждение и составляет $record_name
и $record_score
undef
(вызывая ваше второе предупреждение при сравнении $this_score
с $record_score
).Код работает, потому что численно undef
считается 0, но генерирует предупреждения.
Простое исправление заключается в использовании вместо него $dates{$this_date} || '|0'
.Это обеспечивает значение по умолчанию для новых дат, устанавливая $record_name
в пустую строку и $record_score
в 0:
use strict;
use warnings;
our %dates;
foreach my $line (<DATA>) {
chomp $line;
my ($this_date, $this_name, $this_score) = split /\s+/, $line;
my ($record_name, $record_score) = split /\|/, $dates{$this_date} || '|0';
if ($this_name && $this_score) {
if ($this_score > $record_score) {
$dates{$this_date} = join "|", ($this_name, $this_score);
}
}
}
foreach my $date (keys %dates) {
my ($name, $score ) = split /\|/, $dates{$date};
print " The high_scored for $date was $name with $score\n";
}
__DATA__
2/15/2002 Joe 155
2/15/2002 Mike 108
2/15/2002 Pete 209
2/22/2002 Joe 158
2/22/2002 Mike 99
2/22/2002 Pete 163
3/1/2002 Joe 172
3/1/2002 Mike 125
Но вы должны прочитать Perl Data Structures Cookbook и рассмотретьиспользуя сложную структуру данных вместо того, чтобы join
и split
ваши данные просто хранить их в хэше.