Warum wird Perl sich beschweren, über die "Verwendung von nicht initialisierten Wert" in mein CGI-Skript?
Bin ich die Reinigung meines Perl-code, die für die Produktion freigeben und stieß dabei auf eine seltsame Warnung in der Apache-error-log.
Er sagt:
[Thu Nov 5 15:19:02 2009] Clouds.pm: Use of uninitialized value $name in substitution (s///) at /home/mike/workspace/olefa/mod-bin/OSA/Clouds.pm line 404.
Den relevanten code ist hier:
my $name = shift @_;
my $name_options = shift @_;
$name_options = $name_options eq 'unique' ? 'u'
: $name_options eq 'overwrite' ? 'o'
: $name_options eq 'enumerate' ? 'e'
: $name_options =~ m/^(?:u|o|e)$/ ? $name_options
: q();
if ($name_options ne 'e') {
$name =~ s//_/g;
}
So, warum die Warnung vor einer nicht initialisierten Variablen, wie es ist deutlich initialisiert?
- Wie wissen Sie, dass Sie vergangen, nichts zu dieser Funktion?
- In computer-Programmierung, Worte wie "eindeutig", "offensichtlich", und "unkompliziert" sind ironisch gemeint. Der Moment, in dem Sie Ihnen sagen, das Gegenteil ist wahr. Es ist ein Gesetz des Universums.
- Die Linie 404?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Warnung bedeutet lediglich, dass
$name
war nie mit einem Wert gefüllt, und Sie versuchte dabei eine substitution Betrieb (s///
) auf. Der Standardwert der variable ist nicht definiert (undef
).Rückblick durch das Skript
$name
bekommt seinen Wert aus@_
. Dies bedeutet, dass entweder@_
leer war, oder hatte seine ersten Wert alsundef
.Je nachdem, was Ihre Unterprogramm braucht, um zu tun, überprüfen Sie Ihre Werte, bevor Sie Sie verwenden. In diesem Fall, da Sie etwas in
$name
,croak
wenn es nicht etwas in dieser variable. Sie erhalten eine Fehlermeldung, aus der Sicht des Aufrufers, und Sie werden den Schuldigen finden.Können, können Sie auch verlieren die Komplexität der bedingte operator Kette, indem Sie ein hash-lookup, das gibt auch Ihnen eine chance zu initialisieren
$name_option
. In Ihrem fallback-Fall, verlassen Sie$name_option
undefined:Debug-durch teilen und erobern
Ist es durchaus üblich, zu laufen, zu bugs, die "offensichtlich unmöglich" --- auf den ersten Blick. Ich in der Regel versuchen Sie, um zu bestätigen meine Annahmen mit einfachen print-Anweisung (oder eine gleichwertige Möglichkeiten, um einige Informationen wieder aus dem Programm: Für CGI-Skripte, die eine einfache print ruinieren können Ihre Header).
So, ich würde eine Aussage wie
in den code an der vermuteten Linie. Sie werden überrascht sein über die möglichen Ausgabeoptionen:
print "testing: ", Data::Dumper->new([$name],['name'])->Useqq(1)->Dump;