2009-08-12 6 views
1

Verwandte/möglich Duplikat: Why do I get "uninitialized value" warnings when I use Date::Manip's sortByLength?Warum erhalte ich Warnungen "nicht initialisierter Wert", wenn ich Date :: Manips UnixDate in einem Sortierblock verwende?

Dieser Codeblock:

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

Erzeugung hielt die folgenden Fehler Warnung:

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

Date::Manip ist ein CPAN-Modul. Und Linie 244 von Date :: Manip wird im folgenden Code-Block gefunden:

# 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"; 

Aber dann einschließlich dieser (Ausdruck der tatsächlichen Unix Date-Wert an die Konsole im Logger) vor dem Code-Block zu sortieren die Werte:

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

entfernt, um die Fehler Warnungen vollständig. Warum? Und was ist eine gute Lösung, anstatt all diese Protokollierungsanweisungen zu machen?

HINWEIS: Keiner der sortierten Werte ist undefiniert, denn wenn ich sie im Logger ausgedruckt habe, konnte ich sehen, dass jeder von ihnen einen numerischen Wert hatte.

+0

Können Sie Ihre Logging-Anweisung in den Sortierblock setzen, um die tatsächlichen Werte von $ a und $ b zu sehen? – zakovyrya

+0

Wie mache ich das? – Kys

+0

Auch würde ich lieber keinen Code im CPAN-Modul – Kys

Antwort

-3

So habe ich die Zeile Code meine Daten zu speichern:

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

konnte ich $ a und $ b ONCE-Dump, dann habe ich die Fehler wie> 50 Mal, gefolgt von einem Dump $ a und $ b für etwa 20 mal (ich habe 10 Elemente in meinem Array)

+0

Warte, das ist keine Antwort. Ich wollte es als Kommentar schreiben. – Kys

-2

Etwas stimmt nicht mit Date :: Manip in der Art, wie es spezielle Variablen lokalisiert. Versuchen Sie Date_Init() aufzurufen, bevor Sie sortieren. Es scheint, das Problem zu lösen:

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; 

Ausgang:

$VAR1 = [ 
      { 
      'model' => 'toyota', 
      'year' => '2001' 
      }, 
      { 
      'model' => 'mitsu', 
      'year' => '2005' 
      }, 
      { 
      'model' => 'mazda', 
      'year' => '2008' 
      } 
     ]; 
+3

Eine echte Frage ist, warum jemand die Jahre oben durch 'UnixDate' sortieren möchte. –

+1

Außerdem führt das oben genannte "Date_Init()" - Aufruf nicht zu nicht initialisierten Warnungen. Unter Windows kotzt es, weil es die Zeitzone nicht herausfinden kann. Das Setzen von 'TZ' in der Shell behebt das. Unter Linux läuft der obige Code ohne "Date_Init()". Ihre Antwort scheint also nicht auf das Problem des OP bezogen zu sein. –

+0

Warum sollte niemand die Jahre oben durch UnixDate sortieren wollen? – Kys

1

ich ein letztes Mal versuchen werde dies so klar wie möglich zu beantworten.

Erstens, wenn alle Zeitstempel wie 2008-08-07T22:31:06Z sind, gibt es keine Notwendigkeit, sie durch UnixDate als Standard sort zur Karte cmp verwendet, wird sie richtig sortieren.

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

Keine Warnungen, keine Fehler ... Ergo, alles, was Sie auf dieser Seite gesetzt haben ist:

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

Ausgang (nach TZ in cmd Einstellung Date::Manip zu besänftigen) ein großes Durcheinander von einem roten Hering. Außerdem erklärt das immer noch nicht, woher die 1249998666 in your other question stammt.

+0

H-ha, das ist einfach eins.Er setzte Unix-Timestamps (Produkt von UnixDate) in ein Array von vermeintlich Hash-Referenzen von Automobildaten und später versuchte er, sie so zu betreiben, als wären sie Hash-Referenzen: push (@not_sorted_models, UnixDate ($ _-> {'year'} ,"%O")); daher der Fehler Kann nicht Zeichenfolge ("1249998666") als HASH Ref – zakovyrya

+1

@zakovyrya genau, warum ich habe die OP aufgefordert, die tatsächlichen Datenstrukturen und Code, den er verwendet und versucht, andere von einem wilden gehen zu entmutigen Gan-Chase mit den Fragmenten, die er bisher in drei getrennten Fragen gepostet hat. –

+0

@Sinan Ünür: Manchmal macht es Spaß :) Ist es nicht das, worum es auf dieser Seite geht? – zakovyrya

Verwandte Themen