2013-06-18 3 views
8

का उपयोग कर पर्ल मेरे पास एक छोटा सा सवाल था। मैं कुछ कोड पढ़ रहा था और क्योंकि मेरे स्कूल ने मुझे पर्ल प्रोग्रामिंग के बारे में कुछ भी उपयोगी नहीं बताया, मैं यहां लोगों से पूछने के लिए हूं। मैं देख रहा हूँ इस लाइन कुछ पर्ल कार्यक्रमों में एक बहुत उपयोग किया जा रहा:विशेष चरित्र और

$variable = &something(); 

मैं नहीं जानता कि क्या & संकेत यहाँ का मतलब है के रूप में मैं कभी नहीं पर्ल में यह कहना। और something एक सबराउटिन है (मुझे अनुमान है)। यह आमतौर पर एक नाम कहता है और इसमें कभी-कभी फ़ंक्शन की तरह तर्क भी होते हैं। क्या कोई मुझे बता सकता है कि & यहां खड़ा है और something हर समय क्या है।

परिवर्तनीय कुछ प्रकार के लौटा मूल्य लेता है और फिर कुछ स्थितियों की जांच करने के लिए प्रयोग किया जाता है, जो मुझे लगता है कि यह एक सबराउटिन है। लेकिन फिर भी & क्यों?

धन्यवाद

उत्तर

14

पर्ल & के पुराने संस्करणों में सबरूटीन्स कॉल करने के लिए इस्तेमाल किया गया था। अब इस, आवश्यक नहीं है और \& ज्यादातर सबरूटीन के लिए एक reference लेने के लिए प्रयोग किया जाता है

my $sub_ref = \&subroutine; 

या अनदेखी करने के लिए समारोह प्रोटोटाइप (http://perldoc.perl.org/perlsub.html#Prototypes)

संदर्भित सबरूटीन्स & के लिए अलावा bitwise and ऑपरेटर, है

http://perldoc.perl.org/perlop.html#Bitwise-And

+0

ओह तो अगर मैं बिना एक और संकेत के लिए इसे बदल, यह अभी भी काम करेगा? – ban

+1

हाँ, यह अभी भी काम करेगा। –

+0

ठीक है। इसलिए मैं उस फ़ंक्शन को नहीं ढूंढ पा रहा हूं जो यह इंगित कर रहा है। यह किसी अन्य फाइल में होना चाहिए। लेकिन क्या आप मुझे बता सकते हैं कि पैकेज पैकेज का उपयोग किए बिना उन्होंने किसी अन्य फ़ाइल से फ़ंक्शन कैसे कहा: पैकेज :: सब() – ban

27

लगभग हर बार जब आप &के बाहर देखते हैं 10 और EXRP && EXPR, यह एक त्रुटि है।


  • &foo(...)foo(...)foo के प्रोटोटाइप को छोड़कर के रूप में ही ध्यान नहीं दिया जाएगा है।

    sub foo(&@) { ... }  # Cause foo to takes a BLOCK as its first arg 
    
    foo { ... } ...; 
    &foo(sub { ... }, ...); # Same thing. 
    

    केवल subroutines (ऑपरेटरों नहीं) &foo(...) द्वारा बुलाया जाएगा।

    sub print { ... } 
    print(...);   # Calls the print builtin 
    &print(...);  # Calls the print sub. 
    

    आपको शायद अपने पूरे प्रोग्रामिंग कैरियर में इस सुविधा का उपयोग करने की आवश्यकता नहीं होगी। यदि आप इसे इस्तेमाल करते देखते हैं, तो यह निश्चित रूप से & का उपयोग कर रहा है जब उन्हें नहीं करना चाहिए।

  • &foo&foo(@_) के समान है। अंतर यह है कि @_ में foo में परिवर्तन वर्तमान उप के @_ को प्रभावित करता है।

    आपको शायद अपने पूरे प्रोग्रामिंग कैरियर में इस सुविधा का उपयोग करने की आवश्यकता नहीं होगी। यदि आप इसे इस्तेमाल करते देखते हैं, तो यह निश्चित रूप से & का उपयोग कर रहा है जब उन्हें ऑप्टिमाइज़ेशन पर मूर्खतापूर्ण प्रयास नहीं करना चाहिए। हालांकि, निम्नलिखित बहुत सुंदर है:

    sub log_info { unshift @_, 'info'; &log } 
    sub log_warn { unshift @_, 'warn'; &log } 
    sub log_error { unshift @_, 'error'; &log } 
    
  • goto &foo, &foo के समान है, सिवाय वर्तमान सबरूटीन कॉल स्टैक से पहले हटा दिया जाता है। यह उदाहरण के लिए, स्टैक निशान में दिखाई नहीं देगा।

    आपको शायद अपने पूरे प्रोग्रामिंग कैरियर में इस सुविधा का उपयोग करने की आवश्यकता नहीं होगी। यदि आप इसे इस्तेमाल करते देखते हैं, तो यह निश्चित रूप से अनुकूलन पर एक मूर्ख प्रयास है।

    sub log_info { unshift @_, 'info'; goto &log; } # These are slower than 
    sub log_warn { unshift @_, 'warn'; goto &log; } # not using goto, but maybe 
    sub log_error { unshift @_, 'error'; goto &log; } # maybe log uses caller()? 
    
  • $& पिछले regex अभिव्यक्ति मैच क्या मिलान किया होता है। 5.20 से पहले, इसका उपयोग करने से आपके पूरे दुभाषिया में हर रेगेक्स धीमा हो जाता है (यदि उनके पास कोई कैप्चर नहीं है), तो इसका उपयोग न करें।

    print $&  if /fo+/;  # Bad before 5.20 
    print $MATCH if /fo+/;  # Bad (Same thing. Requires "use English;") 
    print ${^MATCH} if /fo+/p; # Ok (Requires Perl 5.10) 
    print $1  if /(fo+)/; # Ok 
    
  • defined &foo पता चल सके कि एक सबरूटीन मौजूद है की एक पूरी तरह से वैध तरीका है, लेकिन यह कुछ आप कभी भी होने की संभावना की आवश्यकता होगी नहीं है। exists &foo भी समान है, लेकिन उपयोगी नहीं है।

  • EXPR & EXPR बिटवाई और ऑपरेटर है। इसका उपयोग निम्न स्तर के सिस्टम से निपटने के दौरान किया जाता है जो एक शब्द में जानकारी के कई टुकड़े स्टोर करते हैं।

    system($cmd); 
    die "Can't execute command: $!\n"  if $? == -1; 
    die "Child kill by ".($? & 0x7F)."\n" if $? & 0x7F; 
    die "Child exited with ".($? >> 8)."\n" if $? >> 8; 
    
  • &{ EXPR }() (और &$ref()) एक संदर्भ के माध्यम से एक सबरूटीन कॉल है। यह एक पूरी तरह से स्वीकार्य और कुछ आम बात है, हालांकि मैं $ref->() वाक्यविन्यास पसंद करता हूं। अगले आइटम में उदाहरण।

  • \&foo subroutine foo का संदर्भ लेता है। यह एक पूरी तरह से स्वीकार्य और कुछ आम बात है।

    my %dispatch = (
        foo => \&foo, 
        bar => \&bar, 
    ); 
    
    my $handler = $dispatch{$cmd} or die; 
    $handler->(); 
    # Same: &{ $handler }(); 
    # Same: &$handler(); 
    
  • EXPR && EXPR बूलियन और ऑपरेटर है। मुझे यकीन है कि आप इस बेहद आम ऑपरेटर से परिचित हैं।

    if (0 <= $x && $x <= 100) { ... } 
    
+0

bitwise और बूलियन के बारे में भूल गए और। जोड़ा गया। – ikegami

+0

आपको बहुत बहुत धन्यवाद ... यह एक उत्तर में बहुत सारी जानकारी थी – ban

+0

@ikegami ... हमें मत छोड़ो! –

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