相关/可能重复:Why do I get "uninitialized value" warnings when I use Date::Manip's sortByLength?
这段代码:
my @sorted_models = sort {
UnixDate($a->{'year'}, "%o") <=>
UnixDate($b->{'year'}, "%o")
} values %{$args{car_models}};
一直生成以下错误警告:
Use of uninitialized value in length at /.../Date/Manip.pm line 244.
Date::Manip是一个CPAN模块。 Date :: Manip的244行位于以下代码块中:
# 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 Date值打印到记录器中的控制台)包括这些值:
foreach (values %{$args{car_models}}) {
$g_logger->info(UnixDate($_->{'year'},"%o"));
}
完全删除了错误警告。为什么?什么是好的修复,而不是做所有这些日志记录?
注意:没有任何排序值未定义,因为当我在记录器中打印出来时,我可以看到每个值都有一个数值。
答案 0 :(得分:1)
我最后一次尝试尽可能清楚地回答这个问题。
首先,如果所有时间戳都与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> cars Sorted *without* using UnixDate: $VAR1 = [ { 'year' => '2008-08-07T21:31:06Z' }, { 'year' => '2008-08-07T23:31:06Z' }, { 'year' => '2009-08-07T22:31:06Z' } ]; Sorted using UnixDate: $VAR1 = [ { 'year' => '2008-08-07T21:31:06Z' }, { 'year' => '2008-08-07T23:31:06Z' }, { 'year' => '2009-08-07T22:31:06Z' } ];
没有警告,没有错误 ... Ergo ,你在这个页面上放置的只是红鲱鱼的一大堆。此外,这仍然无法解释your other question中的1249998666
来自何处。
答案 1 :(得分:-2)
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'
}
];
答案 2 :(得分:-3)
所以我添加了那行代码来转储我的数据:
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 ONCE,然后我得到了像&gt; 50次的错误,接着是$ a和$ b的转储20次左右(我的数组中有10个元素)