Probleme de type - cast string to ref

Le
c-note
Bonjour,

j'ai un script qui utilise use IO:ipe;use IO::Select; pour communiquer
entre plusieurs processus (Un pere et les fils)

Le pere distribue a chaque fils l'adresse d'un tableau [ex :
ARRAY(0x8153600)]
La communication se fait via des PIPE. La seul chose que puisse
transmettre le pere au fils est une chaine de caractere. Ainsi, il
transmet l'adresse du tableau à traiter sous forme de string. J'obtient
une erreur sur le type :

Can't use string ("0x8153600") as an ARRAY ref while "strict refs" in

Est-il possible de forcer la conversion de type de string vers reference.

J'ai joint un morceau de code simplifié qui rejoue l'erreur :

#!/usr/bin/perl
use strict;
my @tab = ("dimanche", "95874", "mercredi", "15");
my $ref = @tab;

sub run {
my $reftab = shift;
my @tab = @$reftab;
print @$reftab, "";
}

# ok
run($ref);
# ERREUR
run("$ref");

Merci !
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
Paul Gaborit
Le #151907
À (at) Tue, 09 Oct 2007 12:13:45 +0200,
c-note
j'ai un script qui utilise use IO:ipe;use IO::Select; pour communiquer
entre plusieurs processus (Un pere et les fils)


J'imagine que c'est IO::Pipe... ;-)
~

Le pere distribue a chaque fils l'adresse d'un tableau [ex :
ARRAY(0x8153600)]
La communication se fait via des PIPE. La seul chose que puisse
transmettre le pere au fils est une chaine de caractere. Ainsi, il
transmet l'adresse du tableau à traiter sous forme de string.
J'obtient une erreur sur le type :

Can't use string ("0x8153600") as an ARRAY ref while "strict refs" in ...

Est-il possible de forcer la conversion de type de string vers reference.


La stringification (la conversion en chaîne de carcatères) d'un
tableau n'a aucune utilité pour Perl. C'est une simple aide pour le
programmeur. En tous cas, Perl ne peut plus rien en faire.

De plus, les processus ne partagent pas le même espace mémoire et
donc, même en supposant que Perl sache quoi faire de cette adresse, le
second processus ne trouverait certainement pas à cette adresse le
contenu que le premier processus y a stocké.

Deux solutions (au choix selon le besoin) :

- Utiliser un segment de mémoire partagé (via le module IPC::Shareable
par exemple).

- Utiliser le module Storable pour sérialiser les données (le contenu
du tableau) pour envoi comme une suite d'octets puis désérialiser à
l'autre bout.

--
Paul Gaborit - Perl en français -
c-note
Le #151906
À (at) Tue, 09 Oct 2007 12:13:45 +0200,
c-note
j'ai un script qui utilise use IO:ipe;use IO::Select; pour communiquer
entre plusieurs processus (Un pere et les fils)


J'imagine que c'est IO::Pipe... ;-)
~

Le pere distribue a chaque fils l'adresse d'un tableau [ex :
ARRAY(0x8153600)]
La communication se fait via des PIPE. La seul chose que puisse
transmettre le pere au fils est une chaine de caractere. Ainsi, il
transmet l'adresse du tableau à traiter sous forme de string.
J'obtient une erreur sur le type :

Can't use string ("0x8153600") as an ARRAY ref while "strict refs" in ...

Est-il possible de forcer la conversion de type de string vers reference.


La stringification (la conversion en chaîne de carcatères) d'un
tableau n'a aucune utilité pour Perl. C'est une simple aide pour le
programmeur. En tous cas, Perl ne peut plus rien en faire.

De plus, les processus ne partagent pas le même espace mémoire et
donc, même en supposant que Perl sache quoi faire de cette adresse, le
second processus ne trouverait certainement pas à cette adresse le
contenu que le premier processus y a stocké.

Deux solutions (au choix selon le besoin) :

- Utiliser un segment de mémoire partagé (via le module IPC::Shareable
par exemple).

- Utiliser le module Storable pour sérialiser les données (le contenu
du tableau) pour envoi comme une suite d'octets puis désérialiser à
l'autre bout.



je vais tester la serialisation des données.

Merci


Publicité
Poster une réponse
Anonyme