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日付値をロガーのコンソールに出力する):

foreach (values %{$args{car_models}}) {
    $g_logger->info(UnixDate($_->{'year'},"%o")); 
}

エラー警告を完全に削除しました。なんで?そして、これらすべてのロギングステートメントを実行する代わりに良い修正は何ですか?

注:ロガーで印刷したときに、すべての値に数値があることがわかったため、並べ替えられた値はいずれも未定義ではありません。

4

3 に答える 3

1

最後にもう一度、これにできるだけ明確に答えようとします。

まず、すべてのタイムスタンプが のようなものである場合、標準のを使用してそれらを正しくソートするため2008-08-07T22:31:06Z、それらをマッピングする必要はありません。UnixDatesortcmp

#!/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;

出力(placateに設定TZした後):cmdDate::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'
          }
        ];

警告もエラーもありません...したがって、このページに掲載したのは、大きな混乱の 1 つだけです。その上、これはまだ他の質問の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 を 1 回ダンプすることができた後、50 回以上のエラーが発生し、続いて $a と $b が 20 回ほどダンプされました (配列に 10 個の要素があります)。

于 2009-08-12T18:38:45.067 に答える