Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

encore moi : hash

5 réponses
Avatar
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>\n",$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

5 réponses

Avatar
Jean-Baptiste Mazon
kurtz le pirate writes:

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.

Avatar
Mark Clements
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 "<%8.6f, %8.6f, %8.6f>n",$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;


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



Avatar
kurtz le pirate
In article ,
Jean-Baptiste Mazon wrote:

kurtz le pirate writes:

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


Avatar
kurtz le pirate
In article <460966ab$0$25922$,
Mark Clements wrote:

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

Avatar
Mark Clements
kurtz le pirate wrote:
In article <460966ab$0$25922$,
Mark Clements wrote:

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>