2009-08-12 5 views
1

可能/関連重複:Why do I get "uninitialized value" warnings when I use Date::Manip's sortByLength?Date :: ManipのUnixDateをソートブロックで使用すると、「初期化されていない値」の警告が表示されるのはなぜですか?

このコードブロック:

 
Use of uninitialized value in length at /.../Date/Manip.pm line 244. 

Date::ManipがCPANモジュールである:

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

は、次エラー警告を発生させる維持。そして、日付のライン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")); 
} 

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

注記:ソートされた値はどれも定義されていません。なぜなら、それらをロガーで印刷したとき、すべての数値が数値であることが分かりました。

+0

$ aと$ bの実際の値を表示するために、ロギングステートメントをソートブロックに置くことはできますか? – zakovyrya

+0

どうすればいいですか? – Kys

+0

また、私はむしろCPANモジュールのコードに触れないでください – Kys

答えて

-3

は、だから私は、コードの行が私のデータをダンプすることを追加しました:私は、ONCE $ aと$ bをダンプすることができました、そして、私はのダンプが続く> 50回のようなエラーが発生し、得

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を20回以上(私の配列には10個の要素があります)

+0

これは答えではありません。私はコメントとしてそれを書くことを意味しました。 – Kys

-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' 
      } 
     ]; 
+3

本当の疑問は、誰かが上記の年を 'UnixDate'を通してソートしてソートする必要がある理由です。 –

+1

さらに、上記の 'Date_Init()'呼び出しを省略しても、初期化されていない値の警告は発生しません。 Windowsでは、タイムゾーンを把握することができないので、それは賞賛されます。シェルで 'TZ'を設定すると、それが修正されます。 Linuxでは、上記のコードは 'Date_Init()'がなくてもうまく動作します。あなたの答えは、OPの問題に関連していないようです。 –

+0

UnixDateで上記の年をソートする必要があるのはなぜですか? – Kys

1

私はのように明確に可能な限りこれを答えるために最後にもう一度トライするつもりです。

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

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

Date::ManipをなだめるためにcmdTZを設定した後)出力:

 
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' 
      } 
     ]; 

警告なしエラーなし ... エルゴ、あなたがこのページに置いてきたすべてがあります赤いニシンの1つの大きな混乱。また、1249998666your other questionのどこから来たのかはまだ説明していません。

+0

H-ha、それは簡単です。彼はUnixDateの製品であるunixタイムスタンプを自動車データのハッシュリファレンスの配列に入れ、後でハッシュリファレンスとして操作しようとしました: push(@not_sorted_models、UnixDate($ _-> {'year'} 、 "%o")); したがって、エラーは文字列( "1249998666")をHASH ref – zakovyrya

+1

@ zakovyryaとして使用することはできません。私はOPに実際のデータ構造と彼が使用しているコードを表示し、他人が野生彼が今までに3つの別々の質問で投稿した断片でガチョウの追跡を行う。 –

+0

@SinanÜnür:時にはそれは楽しいものになります:)このサイトの内容は何ですか? – zakovyrya

関連する問題