2016-03-03 12 views
6

मैं कुछ बहुत पुराने पर्ल कोड (नहीं मेरे कोड) को अद्यतन करने पर काम कर रहा हूँ क्या करता है और मैं एक सबरूटीन में निम्नलिखित में आए:क्या पर्ल तारांकन sigil

sub DoEvent { 
    local(*eventWEH, $foreachFunc, @args) = @_; 
    $ret = do $foreachFunc(*eventWEH, @args); 
} 

यह पर्ल 5.6 में ठीक काम करने के लिए लग रहा था .1 लेकिन अब पर्ल 5.22 जो सिर्फ करते $ foreachFun (

क्या चर * eventWEH?

के सामने तारे का चिह्न का उद्देश्य है अगर यह थे 'सी' के बाद एक सिंटैक्स त्रुटि देता है में काम करता है मैं कुछ प्रकार के सूचक का सुझाव दूंगा। कोई सुझाव?

ईटीए: इस सब को पहले पैरामीटर के लिए कई अलग-अलग प्रकार के साथ बुलाया जाता है। उदाहरण के लिए:

&DoEvent($abc, "DoAbc", @args); 

और

&DoEvent(@xyz, "DoXyz", @args); 

तो प्रति के रूप में जवाब दिया, यह की तरह * eventWEH मिलान करने के लिए जो कुछ भी पैरामीटर उप करने के लिए पारित हो जाता है एक अलग डेटा प्रकार पर ले जा सकते हैं लग रहा है।

+0

क्या आप सुनिश्चित हैं कि यह 'और DoEvent (\ $ abc," DoXyz ", @args)' और 'और DoEvent (\ @ xyz," DoXyz ", @args) नहीं है? जो आपने पोस्ट किया है वह ज्यादा समझ में नहीं आता है। – ikegami

उत्तर

2

यह नामस्थान प्रतीक सिगिल है जिसमें अन्य सभी प्रकार शामिल हैं। पुराने पर्ल कोड में आमतौर पर फ़ाइल हैंडल के साथ काम करने के लिए प्रयोग किया जाता है। आधुनिक पर्ल को सरल स्केलर्स का उपयोग करना चाहिए - यानी $

2

यह glob है, जो सीधे प्रतीकात्मक तालिका तक पहुंचता है। इस प्रकार आप उदाहरण के लिए टाइप (या, उस नाम के साथ किसी भी प्रकार) का जिक्र किए बिना एक चर का उपयोग कर सकते हैं। शायद ही कभी एक कारण है कि आपको इसे आजकल पर्ल में उपयोग करना होगा।

यहां कुछ संदर्भ on symbol table, an interesting use of it, और overview का थोड़ा सा संदर्भ हैं। पुस्तकें "प्रोग्रामिंग पर्ल" और "मास्टरिंग पर्ल" में एक आधिकारिक कवरेज है।

13

वाक्यविन्यास त्रुटि में ग्लब्स (तारांकन सिगिल के साथ प्रतीकों) के साथ कुछ लेना देना नहीं है। वाक्यविन्यास त्रुटि 5.20 में do $func(LIST) को हटाने के कारण है।

$ret = $foreachFunc->(*eventWEH, @args); 

अपने शाब्दिक प्रश्न के लिए के रूप में साथ

$ret = do $foreachFunc(*eventWEH, @args); 

बदलें, *foo एक typeglob, या संक्षेप में ग्लोब है। एक ग्लोब निम्नलिखित सी संरचना का एक उदाहरण के एक प्रॉक्सी है:

struct gp { 
    SV *  gp_sv;   /* scalar value */ 
    struct io * gp_io;   /* filehandle value */ 
    CV *  gp_cv;   /* subroutine value */ 
    U32   gp_cvgen;  /* generational validity of cached gp_cv */ 
    U32   gp_refcnt;  /* how many globs point to this? */ 
    HV *  gp_hv;   /* hash value */ 
    AV *  gp_av;   /* array value */ 
    CV *  gp_form;  /* format value */ 
    GV *  gp_egv;   /* effective gv, if *glob */ 
    PERL_BITFIELD32 gp_line:31; /* line first declared at (for -w) */ 
    PERL_BITFIELD32 gp_flags:1; 
    HEK *  gp_file_hek; /* file first declared in (for -w) */ 
}; 

Globs मुख्य रूप से आंतरिक रूप से उपयोग किया जाता है, हालांकि कुछ फ़ाइल हैंडल मुख्य रूप से नामित globs (*STDIN, *STDOUT और *STDERR) के माध्यम से पहुंचा जा सकता है, और वे करने के लिए उपयोग किया जाता है उपनाम बनाएं (*foo = \&bar;)।

+1

'perl -i ~ -pe's/do (\ $? \ W +) (? = \()/$ 1 ->/g '* .pl' या ऐसा कुछ भी उन्हें ठीक करना चाहिए। – ikegami

0

पुराने दिनों में, आप एक typeglob उपयोग करने के लिए एक फ़ाइल हैंडल के आसपास पारित करने के लिए, यहाँ की तरह होगा:

# eventWEH is a global filehandle 
open(eventWEH, $filename) or die "Couldn't open $filename: $!"; 
somefunc(*eventWEH); 

लेकिन आजकल आप उचित शाब्दिक filehandles है, तो आप कर सकते हैं

my $event_fh; 
open($event_fh, '<', $filename) or die "Couldn't open $filename: $!"; 
somefunc($event_fh); 
+0

वर्तमान दिनों में, हम अभी भी फ़ाइल हैंडल को पास करने के लिए टाइपग्लब्स का उपयोग करें। हम सिर्फ स्केलर्स में संदर्भों को संग्रहीत करते हैं। 'प्रिंट ("$ event_fh \ n"); ' – ikegami

+0

हमें इसकी आवश्यकता नहीं है, हालांकि हम एक फ़ाइल हैंडल को सीधे स्केलर में रख सकते हैं 'perl -e'my $ fh = \ * STDOUT; प्रिंट ($ fh "$ fh \ n"); $ fh = * $ fh {IO}; प्रिंट ($ fh "$ fh \ n");' ' – ikegami

संबंधित मुद्दे