2015-04-13 14 views
6

Entwicklungsumgebung ist O X 10.10.3, Perl -vPerl wirft "Schlüssel auf der Referenz experimentell"

This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level 
(with 2 registered patches, see perl -V for more detail) 

Hier ist das Problem

Ich zog das Projekt von meinem lokalen Umfeld ein Windows Server und jetzt bekomme ich den folgenden Fehler:

"Schlüssel auf Referenz ist experimentell bei CGI/Router.pm Linie 94."

Linie 94 des Moduls zeigt

my $num_regexes = scalar keys $token_regexes; 

das gesamte Modul hier https://github.com/kristiannissen/CGIRouter

gefunden werden kann ich den Router-Modul wie diese

$router->add_route('GET', '/home', sub { 
print header(-type => 'text/html', -charset => 'utf-8'); 

print "Hello Pussy"; 
}); 

instanziiert Ich habe dieses Problem nicht lokal, aber jetzt, wo ich auf Produktionsserver umziehe, bekomme ich dieses Problem. Soweit ich das beurteilen kann, hängt es mit einer bestimmten Perl-Version zusammen, aber bevor ich den Anbieter auffordere, Perl zu aktualisieren, würde ich gerne wissen, ob es etwas gibt, was ich tun kann, um dieses Problem zu vermeiden.

Antwort

16

Die Dokumentation für Schlüssel, perldoc keys, hat dies auf einem Hashreferenz über die Verwendung von Tasten zu sagen:

Starting with Perl 5.14, keys can take a scalar EXPR, which must contain a reference to an unblessed hash or array. The argument will be dereferenced automatically. This aspect of keys is considered highly experimental. The exact behaviour may change in a future version of Perl.

for (keys $hashref) { ... } 

Um das Problem zu vermeiden, wird nicht helfen, Perl aktualisieren. Das Modul muss aktualisiert werden, um Schlüssel in der erwarteten Weise zu verwenden, anstatt eine experimentelle Funktion zu verwenden. Das heißt, es muss die Hashrefereferenz vor dem Aufruf von keys dereferenziert werden.

Insbesondere Änderung

my $num_regexes = scalar keys $token_regexes; 

zu

my $num_regexes = scalar keys %$token_regexes;