2012-05-09 7 views
7

के लिए लेक्सिकल फ़ाइलहेडल perdoc Socket पृष्ठ में, वे सॉकेट के लिए वैश्विक फ़ाइलहेडल का उपयोग करते हैं। लेकिन अगर मैं बाल प्रक्रियाओं द्वारा बुलाए गए सबराउटिन में सॉकेट बनाता हूं, तो क्या सॉकेट का उपयोग कर लेक्सिकल फाइलहेडल का उपयोग करना बेहतर है?perl (अच्छी प्रैक्टिस): सॉकेट

इस तरह:

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

के बजाय:

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

ठीक हो रहा है, लेकिन अगर यह एक बेहतर अभ्यास या पूरी तरह से बेकार है मैं नहीं जानता ...

धन्यवाद

+2

असल में, यह सॉकेट –

उत्तर

10

हां, यह लेक्सिकल फ़ाइल हैंडल का उपयोग करने के लिए एक बेहतर अभ्यास है। लेकिन पर्ल 5.0 में उनके पास नहीं था, इसलिए बहुत सारे पुराने कोड और दस्तावेज हैं जो वैश्विक फ़ाइल हैंडल का उपयोग करते हैं, और इसमें से अधिकांश को शब्दावली का उपयोग करने के लिए अद्यतन नहीं किया गया है।

पीएस तुम्हें पता है कि आप, सही

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

बजाय पिछले लाइन पर my डालने की कह सकते हैं?

+0

के [हाल के संस्करणों] (https://metacpan.org/module/Socket) में तय किया गया है। मैं चाहता हूं कि लोग "लेक्सिकल फाइलहेडल" शब्द को गलत तरीके से रोकना बंद कर दें जो वास्तव में ** * मतलब, जो "स्वत: वितरित फ़ाइल हैंडल" है। – tchrist

1

हां वैश्विक के बजाय लेक्सिकल स्कॉप्ड का उपयोग करना हमेशा बेहतर होता है। आप अद्वितीय हैंडल की जरूरत है, हालांकि वैश्विक, Symbol package

+0

हां, यह डॉक्टर से है। आप एक ग्लोब में हैंडल है। – tuxuday

+0

"प्रतीक :: gensym एक अज्ञात ग्लोब बनाता है और इसका संदर्भ देता है। इस तरह के ग्लोब संदर्भ को फ़ाइल या निर्देशिका संभाल के रूप में उपयोग किया जा सकता है।" ठीक है लेकिन कोड "मेरे $ सॉकेट" के साथ, और फ़ाइल के लिए सॉकेट() या ओपन() में इसका उपयोग करते हुए, perl एक अनाम लेक्सिकल फ़ाइलहेडल भी बनाता है, नहीं? – user1334149

+0

हाँ, खुले और सॉकेट फ़ाइल-हैंडल को स्वतः सक्रिय करें –

1

कोशिश Socket मॉड्यूल उपयोगी है जब आप कैसे अपने सॉकेट कॉन्फ़िगर किया गया है के साथ कुछ निम्न स्तर फेरबदल करने की ज़रूरत है, लेकिन सबसे उपयोगों के लिए, नहीं तो लगभग सभी का उपयोग करता है, IO::Socket::INET मॉड्यूल एक सरल इंटरफ़ेस प्रदान करता है। ग्लोबल फाइलहेडल के बारे में चिंता करने की आवश्यकता को छोड़कर इसका कन्स्ट्रक्टर सॉकेट के हैंडल को ऑब्जेक्ट के रूप में लौटाता है।