encore moi : hash

Le
kurtz le pirate
re,

j'ai un sous programme :
sub newVector {
my($x, $y, $z) = @_;
my %v=('x',$x,'y',$y,'z',$z);
#printf "<%8.6f, %8.6f, %8.6f>",$v{x},$v{y},$v{z};
return %v;
}

avec my %v=newVector(1.235,5.789,2.354);
si j'enlève le commentaire du print, ç'est ok.

je me suis dis bêtement, je vais faire un autre sous programme pour
afficher mes vecteurs :
sub printVector {
my %thisVector = shift;
printf "<%8.6f, %8.6f,
%8.6f,>",$thisVector{x},$thisVector{y},$thisVector{z};
}

et la, bien sûr, ça ne marche pas. c'est un peu normal car comment
%thisVector peux connaitre les clé 'x','y' et 'z'.

bon alors, existe-t-il un moyen de faire un 'cast', enfin de faire un
truc pour que %thisVector soit conforme à ce que je veux ?


merci

--
klp
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Baptiste Mazon
Le #141842
kurtz le pirate
sub printVector {
my %thisVector = shift;
printf "<%8.6f, %8.6f,
%8.6f,>",$thisVector{x},$thisVector{y},$thisVector{z};
}

et la, bien sûr, ça ne marche pas. c'est un peu normal car comment
%thisVector peux connaitre les clé 'x','y' et 'z'.


Comment transmettez-vous votre vecteur à printVector?

Si c'est "en direct", par ex: printVector %monVecteur, il va être
évalué dans un contexte de liste, et vous le retrouverez dans @_.
Affichez @_ à l'entrée de votre fonction d'affichage, vous comprendrez
tout de suite de quoi il retourne.

En comparant à ce que vous obtenez en affectant 'shift' à %thisVector,
vous devriez facilement trouver une correction.

bon alors, existe-t-il un moyen de faire un 'cast', enfin de faire un
truc pour que %thisVector soit conforme à ce que je veux ?


Vous obtiendrez probablement de meilleures preformances en le
transmettant par référence. Mais ça n'empêche pas ce que vous avez
déjà écrit d'être proche d'une solution qui marche.

Mark Clements
Le #141841
kurtz le pirate wrote:
re,

j'ai un sous programme :
sub newVector {
my($x, $y, $z) = @_;
my %v=('x',$x,'y',$y,'z',$z);
#printf " return %v;
}

avec my %v=newVector(1.235,5.789,2.354);
si j'enlève le commentaire du print, ç'est ok.

je me suis dis bêtement, je vais faire un autre sous programme pour
afficher mes vecteurs :
sub printVector {
my %thisVector = shift;


Devrait être:

my %thisVector = @_;


Pour

my %thisVector = shift;


si vous tourniez le programme avec

use warnings;

vous recevriez une message en style

Odd number of elements in hash assignment at -e line 1.



printf "<%8.6f, %8.6f,
%8.6f,>",$thisVector{x},$thisVector{y},$thisVector{z};
}

et la, bien sûr, ça ne marche pas. c'est un peu normal car comment
%thisVector peux connaitre les clé 'x','y' et 'z'.

bon alors, existe-t-il un moyen de faire un 'cast', enfin de faire un
truc pour que %thisVector soit conforme à ce que je veux ?


merci



kurtz le pirate
Le #141721
In article Jean-Baptiste Mazon
kurtz le pirate
sub printVector {
my %thisVector = shift;
printf "<%8.6f, %8.6f,
%8.6f,>",$thisVector{x},$thisVector{y},$thisVector{z};
}

et la, bien sûr, ça ne marche pas. c'est un peu normal car comment
%thisVector peux connaitre les clé 'x','y' et 'z'.


Comment transmettez-vous votre vecteur à printVector?

Si c'est "en direct", par ex: printVector %monVecteur, il va être
évalué dans un contexte de liste, et vous le retrouverez dans @_.
Affichez @_ à l'entrée de votre fonction d'affichage, vous comprendrez
tout de suite de quoi il retourne.


oui en direct, printVector(%myVector);

En comparant à ce que vous obtenez en affectant 'shift' à %thisVector,
vous devriez facilement trouver une correction.


je vais regarder dans cette direction...


bon alors, existe-t-il un moyen de faire un 'cast', enfin de faire un
truc pour que %thisVector soit conforme à ce que je veux ?


Vous obtiendrez probablement de meilleures preformances en le
transmettant par référence. Mais ça n'empêche pas ce que vous avez
déjà écrit d'être proche d'une solution qui marche.



--
klp


kurtz le pirate
Le #141720
In article Mark Clements
si vous tourniez le programme avec

use warnings;

vous recevriez une message en style

Odd number of elements in hash assignment at -e line 1.



pourtant, mon script commence par :

#!/usr/bin/perl -w
use strict;

le <-w> est équivalent au use warning non ? :))


--
klp

Mark Clements
Le #141719
kurtz le pirate wrote:
In article Mark Clements
si vous tourniez le programme avec

use warnings;

vous recevriez une message en style

Odd number of elements in hash assignment at -e line 1.



pourtant, mon script commence par :

#!/usr/bin/perl -w
use strict;

le <-w> est équivalent au use warning non ? :))


En cette contexte, oui. Je présumerais que tu recevrais le même message

de warnings. Vous avez lancé le programme donc:

programname

ou

perl programmename

C'est la seule chose qui vient à l'ésprit :)

C:TEMP>perl -Mwarnings -le "sub dd { my %hash=shift} ; dd(qw(1 2 3 3))"
Odd number of elements in hash assignment at -e line 1.

C:TEMP>perl -w -le "sub dd { my %hash=shift} ; dd(qw(1 2 3 3))" d d
Odd number of elements in hash assignment at -e line 1.

C:TEMP>perl -w -le "sub dd { my %hash=@_} ; dd(qw(1 2 3 3))" d d

C:TEMP>


Publicité
Poster une réponse
Anonyme