1

相关/可能重复:为什么我在使用 Date::Manip 的 sortByLength 时会收到“未初始化值”警告?

这段代码:

my @sorted_models = sort { 
    UnixDate($a->{'year'}, "%o") <=>
    UnixDate($b->{'year'}, "%o") 
} values %{$args{car_models}};

不断产生以下错误警告:

在 /.../Date/Manip.pm 第 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")); 
}

完全删除了错误警告。为什么?除了执行所有这些日志记录语句之外,还有什么好的解决方法?

注意:没有一个排序值是未定义的,因为当我在记录器中打印它们时,我可以看到它们中的每一个都有一个数值。

4

3 回答 3

1

我将最后一次尝试尽可能清楚地回答这个问题。

首先,如果所有时间戳都是 like 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;

输出(设置TZcmdplacate后Date::Manip):

C:\Temp> 汽车
使用 UnixDate *无*排序:
$VAR1 = [
          {
            '年' => '2008-08-07T21:31:06Z'
          },
          {
            '年' => '2008-08-07T23:31:06Z'
          },
          {
            '年' => '2009-08-07T22:31:06Z'
          }
        ];
使用 UnixDate 排序:
$VAR1 = [
          {
            '年' => '2008-08-07T21:31:06Z'
          },
          {
            '年' => '2008-08-07T23:31:06Z'
          },
          {
            '年' => '2009-08-07T22:31:06Z'
          }
        ];

没有警告没有错误......所以,你在这个页面上放的只是一大堆红鲱鱼。此外,这仍然不能解释你1249998666另一个问题的来源。

于 2009-08-12T21:23:06.733 回答
-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'
          }
        ];
于 2009-08-12T19:05:18.897 回答
-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,然后出现 >50 次的错误,然后转储 $a 和 $b 20 次左右(我的数组中有 10 个元素)

于 2009-08-12T18:38:45.067 回答