当我在排序块中使用Date :: Manip的UnixDate时,为什么会出现“未初始化的值”警告?

时间:2009-08-12 18:24:04

标签: perl sorting date-manipulation

  

相关/可能重复: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")); 
}

完全删除了错误警告。为什么?什么是好的修复,而不是做所有这些日志记录?

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

3 个答案:

答案 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个元素)