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

passage de paramètre référence à un sous programme

4 réponses
Avatar
fr6
Bonsoir,

Je ne comprends pas ce qui ne marche pas ici - qui doit =EAtre simple.

Dans le programme pl d'appel je d=E9calre une r=E9f=E9rence =E0 un hachage =
:
$refhash =3D {};

J'appel le sous programme avec cette r=E9f=E9rence en param=E8tre :

MonPackage::monSousProgram( $refhash );

Je v=E9rifie que dans monSolusProgramme ref($refhash) est bien un
hachage : HASH(0x229b9c) - non nul.

Mais avant cet appel, dans le programme appelant, j'ai ref($refhash)
qui est nul, et apr=E8s aussi :
print "avant ref($refhash)\n"; # ref()
MonPackage::monSousProgram( $refhash );
print "avant ref($refhash)\n"; # ref()

Ce qui fait que : @maListeDeClefs =3D keys %{$refhash}; # est vide.
$nb =3D @maListeDeClefs;

print "$nb\n"; # resultat : 0.

Aussi simple - o=F9 est l'erreur ?

Merci beaucoup.

Fr6

4 réponses

Avatar
espie
In article ,
fr6 wrote:

Aussi simple - où est l'erreur ?



Donne ton vrai code, ou un sous-ensemble suffisant pour exhiber le probleme.

Avec juste une description, pas la moindre idee.
Avatar
fr6
Bonjour Marc,

Le programme appelant :

#!/usr/bin/perl

use Export;


$refHLigne = {} ;

#$HLine = {$numHLine => {$DELIVERABLEREFERENCE => {$CATEGORY =>
[ $val1 .. $val11 { 0 => [ $v01 .. $v04],
# ..
=> [],
#
f(mschain)
=> [],
# }
# ],
# },
# },
# ...,
# };


print "===avant ref($refHligne)n";
Export::readCsvExportIntoHash( $refHLigne );
print "===apres ref($refHligne)n";
#print "--- ref($refHLine): $refHLinen";

@lignes = keys %refHLigne;
$NbLignes = @lignes;
print "===> $NbLignes: $NbLignesn";

Puis le package :

package Export;
sub readCsvExportIntoHash {
my $refHligne = shift;

print "===< ref($refHligne)n";
open( FILE_IN, $ARGV[0] ) or die ("Pb ouverture n");

while (defined($_ = <FILE_IN>)) {
chomp $_;
[ ici le hash est nourri de la lecture du fichier et les traces de
la lecture du hash montrent qu'il a bien pris ses valeurs valeurs ]
}
}

La question : le hash est bien modifié dans le programme appelé, mais
il ne l'est pas dans le programme appelant.
D'ailleurs, pourquoi ref(($refhash) est-il nul dans le programme
appelant après avoir déclaré la référence ( voir précédent me ssage)
sur un hachage :

$refhash = {};
print "avant ref($refhash)n"; # réponse : "ref() "
Ca ne devrait pas être nul - non ?
--
merci



On Nov 17, 2:25 am, (Marc Espie) wrote:
In article .com>,

fr6   wrote:
>Aussi simple - où est l'erreur ?

Donne ton vrai code, ou un sous-ensemble suffisant pour exhiber le proble me.

Avec juste une description, pas la moindre idee.


Avatar
Paul Gaborit
À (at) Sun, 16 Nov 2008 14:14:20 -0800 (PST),
fr6 écrivait (wrote):
Je ne comprends pas ce qui ne marche pas ici - qui doit être simple.

Dans le programme pl d'appel je décalre une référence à un hachage :
$refhash = {};

J'appel le sous programme avec cette référence en paramètre :

MonPackage::monSousProgram( $refhash );

Je vérifie que dans monSolusProgramme ref($refhash) est bien un
hachage : HASH(0x229b9c) - non nul.

Mais avant cet appel, dans le programme appelant, j'ai ref($refhash)
qui est nul, et après aussi :



Le bout de code suivant fonctionne très bien :

----------------------------------------
sub mysub {
my $hl = shift;
$hl->{a} = 3;
}

my $h = {};
mysub($h);
print $h->{a}, "n";
----------------------------------------

Donc votre description ne correspond pas à votre problème. Donnez-nous
un extrait code (simplifié) qui montre votre problème...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
Avatar
Paul Gaborit
À (at) Sun, 16 Nov 2008 22:22:58 -0800 (PST),
fr6 écrivait (wrote):
D'ailleurs, pourquoi ref(($refhash) est-il nul dans le programme
appelant après avoir déclaré la référence ( voir précédent message)
sur un hachage :



Utilisez les deux lignes suivantes en début de script :

use strict;
use warnings;

... et vous verrez la lumière ! ;-)

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