2012-05-09 15 views
7

Nella pagina perdoc Socket, usano filehandle globale per socket. Ma se creo un socket in una subroutine chiamata da processi figli, è meglio usare il filehandle lessicale ancora usando Socket?perl (buona pratica): filehandle lessicale per socket

come questo:

use strict; 
use Socket; 
sub sendData 
{ 
    my $proto = getprotobyname('tcp'); 
    my $socket; 
    socket($socket, PF_INET, SOCK_STREAM, $proto); 
    ... 
    close($socket) 
} 

invece di:

sub sendData 
{ 
    my $proto = getprotobyname('tcp'); 
    socket(SOCKET, PF_INET, SOCK_STREAM, $proto); 
    ... 
    close(SOCKET) 
} 

Sembra essere ok, ma non so se si tratta di una pratica migliore o del tutto inutile ...

Grazie

+2

In realtà, questo è stato corretto in [versioni recenti] (https://metacpan.org/module/Socket) di Socket –

risposta

10

Sì, è una pratica migliore utilizzare i filehandle lessicali. Ma Perl 5.0 non li ha, quindi ci sono un sacco di codice e documentazione più vecchi che usano filehandle globali, e molti di essi non sono stati aggiornati per usare quelli lessicali.

P.S. Voi sapete che si può dire

socket(my $socket, PF_INET, SOCK_STREAM, $proto); 

invece di mettere il my sulla riga precedente, giusto?

+0

Desidero vivamente che le persone smettano di applicare erroneamente il termine "filehandle lessicale" a quello che loro ** veramente * * significa, che è "filehandle autoviviato". – tchrist

1

Sì, è sempre meglio utilizzare scope lessicale anziché globale. Se avete bisogno di maniglie uniche, però globale, provare Symbol package

+0

Sì, è dal doc. Hai manico in un glob. – tuxuday

+0

"Symbol :: gensym crea un glob anonimo e restituisce un riferimento ad esso.Questo riferimento glob può essere usato come un handle di file o directory." ok ma con il codice "my $ socket", e usandolo in socket() o open() per file, perl crea anche un filehandle lessicale anonimo, no? – user1334149

+0

Sì, aperto e socket autovivify l'handle di file –

1

Il modulo Socket è utile se avete bisogno di fare qualche ritocco a basso livello di come i tuoi zoccoli sono configurati, ma per la maggior parte degli usi, se non quasi tutti gli usi, il modulo IO::Socket::INET fornisce un'interfaccia più semplice. Il suo costruttore restituisce l'handle del socket come oggetto, ignorando la necessità di preoccuparsi del filehandle globale.

Problemi correlati