Module Perl Appels de Méthode: ne Peut pas appeler la méthode “X” sur une valeur non définie sur ${UNFICHIER} ligne ${SOMELINE}
Tous sur la place, en particulier dans DBI, je vois ce message tout le temps. C'est déroutant, car la première chose qui vient à l'esprit est que les arguments que je suis de passage de la fonction sont mis en place par le fnud (ou quelque chose de similaire), mais c'est clairement pas le cas.
Donné un module et un script correspondant...
Module: ./lib/My/Module.pm
package My::Module;
use strict;
use warnings;
sub trim {
my $str = shift;
$str =~ s{ \A \s+ }{}xms; # remove space from front of string
$str =~ s{ \s+ \z }{}xms; # remove space from end of string
return $str;
}
Script: ./test.pl
#!/usr/bin/perl
use strict;
use warnings;
use My::Module qw(trim);
print $My::Module->trim( " \t hello world\t \t" );
Je serai de retour le message d'erreur
Ne peux pas appeler la méthode "trim" sur une valeur non définie à l' ./text.pl la ligne 7.
Enfaite, si je l'appelle $My::Module->notamethod( "hello world" );
il donne une erreur similaire.
Quel est le problème avec le script ci-dessus/module?
Qu'est-ce que cette erreur Can't call method “X” on an undefined value at ${SOMEFILE} line ${SOMELINE}
vraiment en train de dire?
Cela fait référence au contexte de l'appel de la méthode adoptée ici pour imprimer) ou le contexte des arguments?
Vous devez vous connecter pour publier un commentaire.
Que la syntaxe est à la recherche d'un objet ou d'un nom de classe dans la variable
$My::Module
et appelant sa méthode trim, mais cette variable n'est pas définie.Au lieu de cela, vous voulez juste dire
print My::Module::trim( " \t hello world\t \t" );
d'appeler le Mon::Module::fonction trim ().De l'utilisation de la ligne, il semble que vous essayez d'importer trim() dans le forfait local de sorte que vous pouvez l'appeler sans le
My::Module::
de qualification, mais le module n'a pas l'air comme il est mis en place pour soutenir l'exportation.Dans votre regexes, le /s /m drapeaux ne sont pas, ils ne font que changer ce ., ^ et $ match, et que vous n'utilisez pas l'un de ceux-ci.
Vous êtes de juxtaposer plusieurs différentes manières de manipuler les modules et les objets - et de se retrouver avec une qui ne fonctionne pas.
Voici quatre approches qui fonctionnent:
1/Mon::Module est une bibliothèque. la garniture n'est pas exporté.
2/Mon::Module est une bibliothèque. la garniture est exporté.
3/MyModule est une classe. la garniture est une méthode de classe.
4/MyModule est une classe, le trim est une méthode de l'objet.
Je pense que vous essayiez pour l'option 1. Dans ce cas, je pense que je vous recommande l'option 2.
Et pour répondre à votre dernière question. Vous obtenez cette erreur, parce que vous essayez d'appeler une méthode sur une variable ($Mon::Module) qui n'est pas défini.
C'est juste la façon dont Perl ne OO. La différence entre la façon dont vous appelez les méthodes.
Cela appelle simplement la garniture sous le Mon::Module package:
D'autre part,
devient automatiquement un appel à la garniture sous le Mon::Module package avec la chaîne "Mon::Module" en tant que premier argument.
Les objets fonctionnent de la même façon:
Se transforme en un appel à la même sous, mais cette fois avec une référence à la m $objet en tant que premier argument.
Ce que vous essayez de faire est:
Qui se traduit par un déréférencement de la variable $Mon::Module (qui n'existe pas), donc le message d'erreur "impossible d'appeler la méthode X sur une valeur non définie". Si $Mon::Module avait une véritable référence à un objet, ce serait la suite d'un appel trim() sur cet objet, avec la référence implicite premier argument.
Edit: les Deux intervenants sont corrects. Cette réponse a été initialement conçu comme un commentaire pour la accepté de répondre. (Est-il un moyen de corriger ça?)
Désolé pour la confusion. J'ai ajouté un peu plus de détails ici alors j'espère qu'il devient de plus en plus clairement comment il se rapporte à la question d'origine (référence à une variable non définie).
new
ligne. Cliquez ici pour voir pourquoi: stackoverflow.com/questions/429657/...