2011-05-23 2 views
1

J'ai une question sur les modules, les modules et la syntaxe. Lorsque vous accédez à un paquet dans le même fichier que je remarque que vous souhaitez utiliser quelque chose comme ....Lors de l'accès aux modules

package test; 
$testVar="This is a test"; 

#and to access it using.. 

package main; 
print($test::testVar); 

... ou tout simplement

package test; 
print($testVar); 

Pourtant, quand j'utilise cette syntaxe pour une utilisation avec un module, en envoyant un argument, je suis censé ommiter le $ depuis le début de la fonction d'impression, mais au-dessus je ne le fais pas. J'ai remarqué que ça ne fonctionnait pas autrement et je ne sais pas pourquoi. Mes matériaux ne clarifient pas.

require module; 
print(package::sub("argument")); 

Pourquoi est-ce? Je suis confus.

Répondre

5

Le signe dollar est un sigil qui indique que la variable nommée est un scalaire.

S'il n'y a pas de déclaration package précédente, l'utilisation de $var_name contient un espace de noms implicite de main, à savoir qu'il est court pour $main::var_name. Dans le cas de votre exemple, où vous avez d'abord package main;, vous devez stipuler que l'espace de noms est test, plutôt que main, donc $test::testVar est requis.

Pour un appel de fonction, vous n'avez pas besoin d'utiliser un sigil. Si vous avez fait, vous utilisez l'esperluette (&), mais en utilisant esperluette lors de l'appel des fonctions est tombé en disgrâce avec beaucoup de programmeurs. *

Comme précédemment, sub_name() est une version abrégée de main::sub_name() ... de la même manière , aucun sigil n'est nécessaire pour appeler le package::sub().

* Références quant à l'utilisation de &:

+1

Les ampersands ne sont pas dépréciés de quelque façon que ce soit. Certaines personnes ne les aiment pas et elles sont souvent inutiles, et utiliser & sans utiliser() crée un type spécial de sous-appel qui n'est généralement pas prévu. Ce dernier bit est parfois utilisé comme argument contre l'utilisation de & en général, mais je ne le trouve pas convaincant. – ysth

+0

@ysth commentaire juste. J'ai reformulé et ajouté quelques liens pour développer ce peu. – Dancrumb

+0

Je sorte de, comprendre. Je pensais que vous alliez dire, dans le cas du module, que le script ne se trouve pas dans la même table main :: symbol. Je suis très nouveau à Perl pour être honnête et ça m'a donné quelques problèmes. –

Questions connexes