OVH Cloud OVH Cloud

print ?

4 réponses
Avatar
kurtz_le_pirate
bonjour,

encore un mystère de perl pour moi. si je résume :

si je fais :
print $objPropEntry->Name," : $value\n";
j'obtiens par exemple :
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE $objPropEntry->Name." = $value\n";
j'obtiens
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE "$objPropEntry->Name = $value\n";
j'obtiens :
Win32::OLE=HASH(0x199bf24)->Name = Scr_ctx_ScripteC.bat

pourquoi n'y a-t-il pas d'interpretation de $objPropEntry->Name dans
ce cas ?




ps : en fait j'écris dans un fichier html. la ligne exacte est :
print OUTFILE
"<tr><td><b>$objPropEntry->Name</b></td><td>$value</td></tr>\n";
mais c'est pas un problème de html.


--
klp

4 réponses

Avatar
Paul Gaborit
À (at) Mon, 29 May 2006 10:35:55 +0200,
"kurtz_le_pirate" écrivait (wrote):
encore un mystère de perl pour moi. si je résume :

si je fais :
print $objPropEntry->Name," : $valuen";
j'obtiens par exemple :
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE $objPropEntry->Name." = $valuen";
j'obtiens
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE "$objPropEntry->Name = $valuen";
j'obtiens :
Win32::OLE=HASH(0x199bf24)->Name = Scr_ctx_ScripteC.bat

pourquoi n'y a-t-il pas d'interpretation de $objPropEntry->Name dans
ce cas ?


Perl n'effectue d'interpolation que sur les variables... pas sur les
appels de procédures, de fonction ou de méthodes.

La manière simple de faire est donc :

print $objPropEntry->Name, " = $valuen";

ou :

print $objPropEntry->Name . " = $valuen";

(Dans le premier cas, la méthode est appelée dans un contexte de liste
alors que dans le second, elle est appelée dans un contexte scalaire.)

Pour forcer l'interpolation d'un appel de fonction, on peut écrire :

print "@{[$objPropEntry->Name]} = $valuen";

ou :

print "@{[scalar $objPropEntry->Name]} = $valuen";

(Dans le premier cas, la méthode est appelée dans un contexte de liste
alors que dans le second, elle est appelée dans un contexte scalaire.)

Ce n'est pas complètement équivalent à cause de la variable $, qui est
utilisée lors de l'interpolation d'une liste. De plus, dans ce cas, le
passage par l'interpolation est plus lent.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
kurtz le pirate
In article ,
Paul Gaborit wrote:


Perl n'effectue d'interpolation que sur les variables... pas sur les
appels de procédures, de fonction ou de méthodes.


merci m'sieu paul :))

je n'avais pas remarqué cette subtilité d'appel de procédure/méthode !
maintenant tout baigne.




--
klp

Avatar
Jean-Marc FRIGERIO
Paul Gaborit wrote:


À (at) Mon, 29 May 2006 10:35:55 +0200,
"kurtz_le_pirate" écrivait (wrote):
encore un mystère de perl pour moi. si je résume :

si je fais :
print $objPropEntry->Name," : $valuen";
j'obtiens par exemple :
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE $objPropEntry->Name." = $valuen";
j'obtiens
scriptPath : Scr_ctx_ScripteC.bat

si je fais :
print OUTFILE "$objPropEntry->Name = $valuen";
j'obtiens :
Win32::OLE=HASH(0x199bf24)->Name = Scr_ctx_ScripteC.bat

pourquoi n'y a-t-il pas d'interpretation de $objPropEntry->Name dans
ce cas ?


Perl n'effectue d'interpolation que sur les variables... pas sur les
appels de procédures, de fonction ou de méthodes.

La manière simple de faire est donc :

print $objPropEntry->Name, " = $valuen";

ou :

print $objPropEntry->Name . " = $valuen";

(Dans le premier cas, la méthode est appelée dans un contexte de liste
alors que dans le second, elle est appelée dans un contexte scalaire.)

Pour forcer l'interpolation d'un appel de fonction, on peut écrire :

print "@{[$objPropEntry->Name]} = $valuen";

ou :

print "@{[scalar $objPropEntry->Name]} = $valuen";

(Dans le premier cas, la méthode est appelée dans un contexte de liste
alors que dans le second, elle est appelée dans un contexte scalaire.)

Ce n'est pas complètement équivalent à cause de la variable $, qui est
utilisée lors de l'interpolation d'une liste. De plus, dans ce cas, le
passage par l'interpolation est plus lent.



Salut,
Si tu y tiens vraiment tu peux essayer Perls6::Interpolators

-- jmf


Avatar
Paul Gaborit
À (at) Tue, 06 Jun 2006 15:47:37 +0200,
Jean-Marc FRIGERIO écrivait (wrote):
Si tu y tiens vraiment tu peux essayer Perls6::Interpolators
[...Perl6::Interpolators...]


Je ne suis pas sûr que ce sera plus rapide... Je dirais même plus : je
suis sûr que ce sera encore moins rapide. ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>