2013-04-02 12 views
14

Ich bekomme diesen seltsamen Fehler beim Importieren eines Moduls, das ich in meine Dancer App geschrieben habe.Prototyp Mismatch Fehler (Perl)

Ich denke, das liegt daran, dass ich in meinem Modul das Perl-JSON-Modul importiere.

Alles scheint gut zu funktionieren, aber ich frage mich, worum es bei diesem Fehler/dieser Warnung geht? Ich kann anscheinend nichts online finden.

+1

Sie tun, indem "das JSON-Modul importieren" bedeutet "pre-Deklarieren der Subroutinen from_json und to_json"? Mit etwas wie 'sub from_json;'? – TLP

+0

nein Ich meine ich benutze die Kopfzeile "JSON verwenden;" in meinem Modul, die eine Datei namens mymodule.pm (mit einem Paket mit dem gleichen Namen) ist. Dann importiere ich diese Moduldatei von meiner Anwendungsdatei mit "use mymodule;". – pepper

+1

Ich verstehe nicht wirklich, warum diese Frage abgelehnt wurde. Scheint mir vollkommen vernünftig. – pepper

Antwort

12

Eine andere Situation, in der dies auftritt, ist, wenn ein anderes Modul, das Sie geladen haben definiert eine von_json/to_json. Ein Beispiel, das ich kürzlich ein paar Mal getroffen habe, ist Dancer. Wenn Sie ein Paket mit

package Foo; 

use Dancer qw/:syntax/; 
use JSON; 

1; 

haben Sie diese Warnung erhalten, weil sie (scheinbar) Tänzer mit: Syntax Import eine from_json und to_json in Ihren Namensraum setzt.

Eine schnelle Lösung in dieser Situation ist nur explizit nichts von JSON importieren:

package Foo; 

use Dancer qw/:syntax/; 
use JSON qw//; 

1; 

Dann in Ihrem Code Sie die vollständigen Paketnamen verwenden, müssen JSON der U-Boote zu bekommen, wie folgt aus:

my $hash = JSON::from_json('{"bob":"sally"}'); 

In einer Situation wie dieser, aber Sie wollen die volle Paketnamen verwenden so klar es ist, die Sie funktionieren, wenn es darum - es gibt mehrere Erklärungen von to_json/from_json, also lassen Sie uns ganz klar sein, welches wir bedeuten.

Wenn Sie die folgenden in Foo.pm und laufen mit „perl Foo.pm“ setzen, mit und ohne die qw// nach dem use JSON, können Sie sehen, wie es funktioniert:

package Foo; 

use Dancer qw/:syntax/; 
use JSON qw//; 

print Dumper(JSON::from_json('{"bob":"sally"}')); use Data::Dumper; 

1; 
1

Siehe Prototypen in perlsub. Die Funktionen from_json und to_json wurden mit anderen Prototypen definiert als im Code verwendet.

2

Der Grund war ich immer dieser Fehler war, weil in meinem eigenen Modul, ich habe die Verwendung Richtlinie wurde mit und Importieren von JSON und anderen Modulen, bevor ich mein eigenes Paket Namespace deklariert, mit

package mymodule 

statt nach. Die Paketdeklaration muss zuerst kommen.

3

Ich glaube, Tänzer/2 stellt Ihnen to_json und from_json zur Verfügung, so dass Sie JSON nicht verwenden müssen.

Dies funktioniert:

use Dancer2 ':syntax'; 
get '/cheeseburgers' => { 
    return to_json($restaurant->make_cheeseburgers); 
} 
+0

sehr wahr. es ist im Paket enthalten, nicht nur Tänzer2, sondern auch Tänzer (die Originalversion). Dennoch benutzte ich Perl-Pakete falsch, und dieser Fehler war eher ein allgemeiner, der sich auf die Reihenfolge bezieht, in der "verwenden" und "erfordern" in einem Skript erscheinen sollten. – pepper