Почему я получаю предупреждения "неинициализированное значение", когда использую UnixDate Date::Manip в блоке сортировки?
Связанный / возможный дубликат: почему я получаю предупреждения "неинициализированное значение", когда использую метод sort::Manip's sortByLength?
Этот блок кода:
my @sorted_models = sort {
UnixDate($a->{'year'}, "%o") <=>
UnixDate($b->{'year'}, "%o")
} values %{$args{car_models}};
продолжал генерировать следующее предупреждение об ошибке:
Использование неинициализированного значения в длине строки /.../Date/Manip.pm 244.
Date:: Manip - это модуль CPAN. И строка 244 Date:: Manip находится в следующем блоке кода:
# Get rid of a problem with old versions of perl
no strict "vars";
# This sorts from longest to shortest element
sub sortByLength {
return (length $b <=> length $a);
}
use strict "vars";
Но затем включите это (распечатка фактического значения даты Unix на консоль в регистраторе) перед блоком кода для сортировки значений:
foreach (values %{$args{car_models}}) {
$g_logger->info(UnixDate($_->{'year'},"%o"));
}
убрал предупреждения об ошибках полностью. Зачем? И что является хорошим решением вместо того, чтобы делать все эти операторы регистрации?
ПРИМЕЧАНИЕ. Ни одно из отсортированных значений не является неопределенным, поскольку, когда я распечатывал их в регистраторе, я мог видеть, что каждое из них имеет числовое значение.
3 ответа
Я собираюсь в последний раз попытаться ответить на это как можно более четко.
Во-первых, если все временные метки похожи 2008-08-07T22:31:06Z
нет необходимости отображать их через UnixDate
как стандарт sort
с помощью cmp
сортирует их правильно.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Date::Manip;
my %args = (
car_models => {
a => { year => '2009-08-07T22:31:06Z' },
b => { year => '2008-08-07T23:31:06Z' },
c => { year => '2008-08-07T21:31:06Z' },
},
);
my @sorted_cmp = sort {
$a->{year} cmp $b->{year}
} values %{ $args{car_models}};
print "Sorted *without* using UnixDate:\n";
print Dumper \@sorted_cmp;
my @sorted_dm = sort {
UnixDate($a->{year}, '%o') <=> UnixDate($b->{year}, '%o')
} values %{ $args{car_models}};
print "Sorted using UnixDate:\n";
print Dumper \@sorted_dm;
Выход (после настройки TZ
в cmd
успокоить Date::Manip
):
C: \ Temp> автомобили Сортировка * без * с использованием UnixDate: $VAR1 = [ { 'year' => '2008-08-07T21:31:06Z' }, { 'year' => '2008-08-07T23:31:06Z' }, { 'year' => '2009-08-07T22:31:06Z' } ]; Сортировка с использованием UnixDate: $VAR1 = [ { 'year' => '2008-08-07T21:31:06Z' }, { 'year' => '2008-08-07T23:31:06Z' }, { 'year' => '2009-08-07T22:31:06Z' } ];
Никаких предупреждений, никаких ошибок... Итак, все, что вы поместили на этой странице, это один большой беспорядок из красной сельди. Кроме того, это еще не объясняет, где 1249998666
на ваш другой вопрос пришел.
Что-то не так с Date::Manip, так как он локализует специальные переменные. Попробуйте вызвать Date_Init(), прежде чем делать сортировку. Кажется, чтобы решить проблему:
use strict;
use warnings;
use Data::Dumper;
use Date::Manip qw(UnixDate Date_Init);
my $cars_ref = {
mazda => {model => 'mazda', year => '2008' },
toyota => {model => 'toyota', year => '2001' },
mitsu => {model => 'mitsu', year => '2005' }
};
Date_Init(); # Initialize Date::Manip first!
my @models =
sort {
UnixDate( $a->{year}, '%o' ) <=> UnixDate( $b->{year}, '%o' );
} values %$cars_ref;
print Dumper \@models;
Выход:
$VAR1 = [
{
'model' => 'toyota',
'year' => '2001'
},
{
'model' => 'mitsu',
'year' => '2005'
},
{
'model' => 'mazda',
'year' => '2008'
}
];
Поэтому я добавил эту строку кода для вывода моих данных:
my @sorted_models = sort { $g_logger->info(Dumper{a=>$a,b=>$b});
UnixDate($a->{'year'}, "%o") <=>
UnixDate($b->{'year'}, "%o"); }
values %{$args{car_models}};
Я был в состоянии сбросить $a и $b ОДИН РАЗ, затем я получил ошибку как>50 раз, сопровождаемый сбросом $a и $b в течение приблизительно 20 раз (у меня есть 10 элементов в моем массиве)