2012-05-09 27 views
7

Na stronie Perdoc Socket używają one globalnej uchwytu pliku dla gniazda. Ale jeśli utworzę gniazdo w podprogramie wywoływanym przez procesy potomne, czy lepiej używać leksykalnego uchwytu pliku nadal używając Socket?perl (dobra praktyka): uchwyt pliku leksykalnego dla gniazda

tak:

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

zamiast:

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

To wydaje się być ok, ale nie wiem, czy jest to lepsza praktyka lub całkowicie bezużyteczny ...

Dzięki

+2

Naprawdę, zostało to naprawione w [nowszych wersjach] (https://metacpan.org/module/Socket) Socket –

Odpowiedz

10

Tak, lepiej używać leksykalnych uchwytów plików. Perl 5.0 ich nie posiadał, więc jest dużo starszego kodu i dokumentacji, która używa globalnych uchwytów plików, a większość z nich nie została zaktualizowana do użycia leksykalnych.

P.S. Wiesz, że można powiedzieć

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

zamiast oddanie my na poprzedniej linii, prawda?

+0

Bardzo chciałbym, aby ludzie przestali niewłaściwie stosować termin "leksykalny plik filehandle" do tego, co naprawdę * * mean, czyli "autoworyzowany filehandle". – tchrist

1

Tak, zawsze lepiej jest używać zakresu leksykalnego zamiast globalnego. Jeśli potrzebujesz unikalne uchwyty, choć globalny, spróbuj Symbol package

+0

Tak, to z dokumentu. Masz uchwyt w glob. – tuxuday

+0

"Symbol :: gensym tworzy anonimowy glob i zwraca do niego odniesienie.Także globalny odnośnik może być użyty jako uchwyt pliku lub katalogu." ok, ale z kodem "moje $ socket", i używając go w socket() lub open() dla pliku, perl tworzy anonimowy leksykalny filehandle również, nie? – user1334149

+0

Tak, otwórz i włącz automatycznie uchwyt pliku –

1

Moduł Socket jest przydatna, gdy trzeba zrobić jakąś małą szczypanie poziomu ze sposobu gniazda są skonfigurowane, ale dla większości zastosowań, jeśli nie prawie wszystkich zastosowań, moduł IO::Socket::INET zapewnia prostszy interfejs. Jego konstruktor zwraca uchwyt gniazda jako obiekt, pomijając potrzebę martwienia się o globalną uchwyt pliku.

Powiązane problemy