2009-08-12 2 views
0

Comment pourrait ce bloc de code à Date/Manip.pm du module Date::Manip:Pourquoi est-ce que j'obtiens des avertissements de "valeur non initialisée" quand j'utilise sortByLength de Date :: Manip?

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

-je obtenir cet avertissement:

Use of uninitialized value in length at /perl/lib/perl5.8/Date/Manip.pm line 244. 
+3

C'est un avertissement, pas une erreur, et il peut être résolu en ne passant pas "undef" à cette fonction. – jrockway

Répondre

0

Si des avertissements pour le diagnostic non initialisées ont été activés (peut-être via ou use warnings;) et si sortByLength étaient en quelque sorte appelés comme un sous-programme normal, plutôt que comme une fonction sort {}, vous verriez probablement cette erreur:

$ perl -Mwarnings=uninitialized -e 'sub sbl { (length $b <=> length $a) } sbl' 
Use of uninitialized value in length at -e line 1. 
Use of uninitialized value in length at -e line 1. 

Ici je reçois deux avertissements, parce que les deux $a et $b sont non initialisée. Difficile à dire sans plus de contexte.

2

Le problème ne se trouve pas réellement là; la fonction est juste appelée avec des paramètres invalides (undef). Pour obtenir une meilleure trace de l'endroit où il est venu, essayez ceci:

$SIG{__WARN__} = sub { 
    require Carp; 
    Carp::confess("Warning: $_[0]"); 
}; 

Cela affichera un stacktrace pour tous les avertissements.

1

Soit $a soit $b sont undef. Vérifiez la liste que vous alimentez au tri utilisant ce sous-programme pour voir si vous avez une valeur indéfinie.

Comment utilisez-vous ce code?

Questions connexes