[perl] - reference vers un file handle

- reference vers un file handle [perl] - Perl - Programmation

Marsh Posté le 03-05-2005 à 20:44:33    

Bonjour,
je rencontre des problemes pour lire des donnes sur un filehandle en utilisant une reference vers celui ci (en C - perl embed). La fonction perl en question recoit un scalaire représentant une socket (deja ouverte du cote C de l'appli), et affiche sur la sorte standard ce que la socket recoit (le tout sans utiliser le module Socket). C'est un serveur. Le code suivant fonctionne bien:
 


#!/usr/bin/perl -w                                                              
##                                                                              
 
use strict;
 
sub                     player_talk($)
{
    $socket = shift;
    return 0 if (!open SH, "<&" . $socket);
    my $input = <SH>;
    if (!$input)
    {
        close SH;
        return -1;
    }
    print "[socket $socket] $input";
    close SH;
    return 1;


 
Mais je trouve un peu lourd de rouvrir et refermer le filehandle (SH) de la socket chaque fois qu'il y a une donnee a lire. Je prefere stocker une reference vers le filehandle et l'utiliser si on a deja lu sur la socket auparavant:
 


#!/usr/bin/perl -w                                                              
##                                                                              
 
use strict;
 
my %sockets = ();
 
sub                     player_talk($)
{
    my $socket = shift;
    my $sh;
 
    if (!exists $sockets{$socket})
    {
        return 0 if (!open SH, "<&" . $socket);
        $sh = \*SH;
        $sockets{$socket} = $sh;
    }
    else
    {
        $sh = $sockets{$socket};
    }
    my $input = <*$sh>;
    if (!$input)
    {
        delete $sockets{$socket};
        close *$sh;
        return -1;
    }
    print "[socket $socket] $input";
    return 1;
}


 
Au niveau du code je ne vois pas ce qui pose probleme dans cette version, pourtant en testant avec telnet, j'obtiens des resultats etranges (le serveur ne recoit rien sur la socket au bout de la deuxieme lecture, déconnexions sans raison... je detaillerai au besoin :) ). En remplacant <> par readline(), des erreurs similaires, mais en tout cas ca ne fonctionne pas non plus.
Quelquechose doit m'echapper, mais je vois pas. Des idees?
Merci d'avance!

Reply

Marsh Posté le 03-05-2005 à 20:44:33   

Reply

Marsh Posté le 04-05-2005 à 23:12:15    

bon, je viens de trouver le probleme.. apparament en perl embed, on ne peut pas utiliser des valeurs preinitialisees en dehors de toute fonction. Par exemple:

my $toto = 42;
sub aff_toto()
{
   print "toto = $toto\n";
}


me renvoie a l'execution:

Use of uninitialized value in concatenation (.) or string [...]

.
Comment contourner ca (sans etre oblige d'initialiser la variable dans la fonction)?

Reply

Marsh Posté le 04-05-2005 à 23:14:27    

(dans le code du premier post, c'est la condition (!exists $sockets{$socket}) qui renvoie toujours vraie a cause du fait que %sockets est globale a la fonction player_talk() ...)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed