2011-01-28 2 views
1

Je suis en train d'étudier la programmation Perl et suis en cours d'exécution dans des déclarations comme ceci:Comment fonctionnent les opérations séparées par des virgules dans perl?

return bless { }, $type; 

Je sais ce que return bless { }; ferait, et je sais aussi ce que return $type; ferait, mais comment les séparant par une virgule affectent l'état , et fonctionne-t-il de la même manière pour tous les opérateurs unaires?

+4

bénissez a deux variantes: 'bénisse REF, CLASSNAME' et' bénir REF'. La notation affichée est équivalente à 'return bless (REF, CLASSNAME);' –

Répondre

5

bless est pas un opérateur unaire, donc ce qui se passe est que $type est transmis à bless (où il est utilisé comme nom de la classe pour bénir la hashref en).

La seule particularité de return est que l'expression de sa main droite pourrait être évaluée dans la liste, scalaire ou contexte vide en fonction du contexte du sous-programme a été appelé.

Le comma operator n'est pas interprété tout différemment dans une instruction return qu'elle ne l'aurait été ailleurs (sauf que vous ne pouvez pas dire si c'est dans une liste ou un contexte scalaire en regardant l'instruction return).

+0

Donc, toute la virgule dans perl est un élément séparé dans une liste? – chustar

+0

@chustar, "Dans un contexte scalaire, il évalue son argument de gauche, rejette cette valeur, puis évalue son argument correct et renvoie cette valeur." Dans le contexte de la liste, il ne fait que séparer les éléments de la liste. – cjm

2

Les fonctions Perl prédéfinies peuvent être appelées avec ou sans parenthèses. La plupart des personnes venant d'autres langues confondent ces fonctions pour les mots-clés/opérateurs.

bénir, annuler, pousser, pop, shift, unshift, impression, split, jointure, etc. sont toutes les fonctions.

Par conséquent, ces deux sont équivalentes:

return bless { }, $type; 
return bless({ }, $type); 

Mais ces deux ne sont pas:

print 2 * 3 + 2; # prints 8 
print(2 * 3) + 2; # prints 6 (with a warning if warnings pragma is on) 
+0

* Déclaré * Les fonctions Perl peuvent être appelées avec ou sans parenthèses. Les builtins ne sont pas spéciaux à cet égard. –

+0

Vous avez raison, sous a {}; un 1,2; fonctionne mais 1, 2; sub a {} ne l'est pas. –

Questions connexes