OVH Cloud OVH Cloud

IO::Select et "structures"

6 réponses
Avatar
Laurent G
Bonjour.
Je ne suis pas un spécialiste du perl (tiens donc ;-) )
et la situation suivante me déroute. Soit, sous cygwin et perl5.8.6, le
code :

my %hashementCon; $hashementCon{\*STDIN} = 1;
my @trestresCon = keys %hashementCon;
$selector->add($trestresCon[0]);
print STDERR "will select among " . $selector->count() . "/" .
$trestresCon[0] . "\n";
$selector->add(\@trestresCon);
print STDERR "will select among " . $selector->count() . "/" .
\@trestresCon . "\n";
$selector->add(\*STDIN);
print STDERR "will select among " . $selector->count() . "/" . \*STDIN
. "\n";

produit la sortie :

will select among 0/GLOB(0x10164414)
will select among 0/ARRAY(0x102fc9cc)
will select among 1/GLOB(0x10164414)

La question est pourquoi la première ligne et la troisième ne sont pas
les mêmes ? Pourquoi une même référence, si elle est fournit directement
ou à travers une place dans un tableau, elle n'est pas traitée de la
même manière ? ( pour la deuxième ligne, IO::Select:add est supposé
accepter aussi des références sur des handles).

D'avance merci.

6 réponses

Avatar
Paul Gaborit
À (at) Fri, 11 Feb 2005 15:59:59 +0000,
Laurent G écrivait (wrote):
La question est pourquoi la première ligne et la troisième ne sont pas
les mêmes ? Pourquoi une même référence, si elle est fournit directement
ou à travers une place dans un tableau, elle n'est pas traitée de la
même manière ?


Parce qu'il semble que vous appliquez vos connaissances de C à Perl : en Perl,
une référence vers un tableau n'est pas la même chose qu'une référence vers
son premier élément !

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

Avatar
Nicolas George
Paul Gaborit wrote in message :
Parce qu'il semble que vous appliquez vos connaissances de C à Perl : en Perl,
une référence vers un tableau n'est pas la même chose qu'une référence vers
son premier élément !


<pedant>

En C non plus !

</pedant>

Avatar
Denis -esp2008-
Bonjour,


une référence vers un tableau n'est pas la même chose qu'une référence vers
son premier élément !


<pedant>
En C non plus !
</pedant>


Oui mais non.

La référence en Perl s'apparente généralement plus à l'adresse en C
qu'à la référence du C ANSI, mais il n'y a pas de totale équivalence
de comportement en fait, donc la comparaison est pour le moins hasardeuse.


--
Denis


Avatar
Paul Gaborit
À (at) Fri, 11 Feb 2005 18:23:33 +0000 (UTC),
Nicolas George <nicolas$ écrivait (wrote):
Paul Gaborit wrote in message :
Parce qu'il semble que vous appliquez vos connaissances de C à Perl : en
Perl, une référence vers un tableau n'est pas la même chose qu'une
référence vers son premier élément !


<pedant>

En C non plus !

</pedant>


Ici, le raisonnement (faux) qui semble être utilisé est le suivant :

1 - Une référence en Perl fonctionne comme un pointeur en C.

2 - L'adresse d'un tableau en C est la même que celle de son premier
élément.

3 - L'adresse contenue dans une référence à un tableau Perl devrait être
la même que celle contenue dans la référence à son premier élément.

(3) semble pouvoir se déduire de (1) et (2).

Sauf qui ni 1 ni 2 ne sont complétement vrai même si ce n'est pas faux ;-). Et
(3) est toujours faux. D'où ma remarque sur la (mauvaise) transposition de
connaissances du C vers Perl.

Les références du C (qui n'existent que depuis peu et sont encore rarement
utilisées) ne fonctionnent pas du tout comme les références du Perl. Elles
ressemblent beaucoup plus aux alias de Perl comme par exemple la variable qui
parcours les éléments d'un tableau dans un 'foreach'.

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


Avatar
Laurent G
Bonjour
Je me réponds à moi-même, des fois que quelqu'un vienne à se confronter
à ce problème dans un proche avenir :
C'est une des FAQ de comp.lang.perl.misc,
une référence ne peut, de base, être utilisée de façon sûre, comme clé
dans une table (transformée irréversiblement en chaîne).
La doc indique alors d'utiliser le paquetage (?) Tie::RefHash.
À+

Laurent G wrote:
Bonjour.
Je ne suis pas un spécialiste du perl (tiens donc ;-) )
et la situation suivante me déroute. Soit, sous cygwin et perl5.8.6, le
code :

my %hashementCon; $hashementCon{*STDIN} = 1;
my @trestresCon = keys %hashementCon;
$selector->add($trestresCon[0]);
print STDERR "will select among " . $selector->count() . "/" .
$trestresCon[0] . "n";
$selector->add(@trestresCon);
print STDERR "will select among " . $selector->count() . "/" .
@trestresCon . "n";
$selector->add(*STDIN);
print STDERR "will select among " . $selector->count() . "/" . *STDIN
. "n";

produit la sortie :

will select among 0/GLOB(0x10164414)
will select among 0/ARRAY(0x102fc9cc)
will select among 1/GLOB(0x10164414)

La question est pourquoi la première ligne et la troisième ne sont pas
les mêmes ? Pourquoi une même référence, si elle est fournit directement
ou à travers une place dans un tableau, elle n'est pas traitée de la
même manière ? ( pour la deuxième ligne, IO::Select:add est supposé
accepter aussi des références sur des handles).

D'avance merci.


Avatar
Paul Gaborit
À (at) Mon, 14 Feb 2005 10:49:01 +0000,
Laurent G écrivait (wrote):
C'est une des FAQ de comp.lang.perl.misc,
une référence ne peut, de base, être utilisée de façon sûre, comme clé
dans une table (transformée irréversiblement en chaîne).
La doc indique alors d'utiliser le paquetage (?) Tie::RefHash.


Désolé pour mes réponses précédentes qui étaient complètement à côté de votre
problème (je n'avais fait que survoler votre code rapidement). Mais tout va
bien puisque vous avez trouvé votre réponse tout seul ;-)

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