Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1175 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [perl] - reference vers un file handle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[perl] - reference vers un file handle

n°1070945
Shabang
Posté le 03-05-2005 à 20:44:33  profilanswer
 

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!

mood
Publicité
Posté le 03-05-2005 à 20:44:33  profilanswer
 

n°1072521
Shabang
Posté le 04-05-2005 à 23:12:15  profilanswer
 

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)?

n°1072523
Shabang
Posté le 04-05-2005 à 23:14:27  profilanswer
 

(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() ...)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [perl] - reference vers un file handle

 

Sujets relatifs
requete access vers mysql[Java]Comment passer par référence un int ?
[Perl] switch() vs hash de fonctionsProbleme client en perl
[Perl] debeuuugage de la mort qui tue!!!![Perl] Optimisation?
[LDAP] faire un lien vers une entrée existante[PERL] lire fichier en paragraphe
implémentation du VA_FILE et Pyramid-TreeJavaScript Popup vers son parent
Plus de sujets relatifs à : [perl] - reference vers un file handle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR