2012-05-09 14 views
7

En la página perdoc Socket, utilizan el identificador de archivo global para socket. Pero si creo un socket en una subrutina llamada por procesos hijos, ¿es mejor usar el manejador de archivos léxico aún usando Socket?perl (práctica recomendada): manejador de archivo léxico para el socket

así:

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

en lugar de:

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

Parece estar bien, pero no sé si es una mejor práctica o completamente inútil ...

Gracias

+2

En realidad, esto se ha solucionado en [versiones recientes] (https://metacpan.org/module/Socket) de Socket –

Respuesta

10

Sí, es una mejor práctica usar manejadores de archivos léxicos. Pero Perl 5.0 no los tenía, por lo que hay una gran cantidad de código y documentación antigua que utiliza manejadores de archivos globales, y gran parte de ella no se ha actualizado para utilizar los léxicos.

P.S. Usted sabe que se puede decir

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

lugar de poner el my en la línea anterior, ¿verdad?

+0

Me gustaría mucho que las personas dejaran de aplicar mal el término "manejador de archivos léxico" a lo que ** realmente * * mean, que es "filehandle autovivved". – tchrist

1

Sí, siempre es mejor usar ámbito léxico en lugar de global. Si necesita asas únicas, aunque global, tratar Symbol package

+0

Sí, eso es del documento. Usted ha manejado en un globo. – tuxuday

+0

"Symbol :: gensym crea un glob anónimo y devuelve una referencia al mismo. Dicha referencia global se puede usar como un archivo o un manejador de directorio". bien, pero con el código "my $ socket", y usándolo en socket() o open() para el archivo, perl también crea un identificador de archivo léxico anónimo, ¿no? – user1334149

+0

Sí, abrir y socket autovivificar el archivo-manejar –

1

El módulo Socket es útil si necesita hacer algunos ajustes bajo nivel con cómo se configuran sus tomas de corriente, pero para la mayoría de usos, si no casi todos los usos, el módulo IO::Socket::INET proporciona una interfaz más simple. Su constructor devuelve el identificador del socket como un objeto, evitando la necesidad de preocuparse por el identificador de archivo global.

Cuestiones relacionadas