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

Le
fr6
Bonsoir,

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 :
print "avant ref($refhash)"; # ref()
MonPackage::monSousProgram( $refhash );
print "avant ref($refhash)"; # ref()

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

print "$nb"; # resultat : 0.

Aussi simple - où est l'erreur ?

Merci beaucoup.

Fr6
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
espie
Le #17868431
In article fr6
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.
fr6
Le #17868721
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
fr6   >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.


Paul Gaborit
Le #17869381
À (at) Sun, 16 Nov 2008 14:14:20 -0800 (PST),
fr6
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 - Perl en français -
Paul Gaborit
Le #17869371
À (at) Sun, 16 Nov 2008 22:22:58 -0800 (PST),
fr6
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 - Perl en français -
Publicité
Poster une réponse
Anonyme