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

Probleme de type - cast string to ref

2 réponses
Avatar
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, "\n";
}

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

Merci !

2 réponses

Avatar
Paul Gaborit
À (at) Tue, 09 Oct 2007 12:13:45 +0200,
c-note écrivait (wrote):
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 - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
c-note
À (at) Tue, 09 Oct 2007 12:13:45 +0200,
c-note écrivait (wrote):
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