2011-06-27 17 views
6

मेरे pervious question में मैंने एक प्रयोग के साथ कई मॉड्यूल का उपयोग करने के लिए कहा। एक perfect answer मिला, और another one मुझे Modern::Perl मॉड्यूल को इंगित किया जो वास्तव में सरल है।पर्ल: स्पष्टीकरण "uni :: perl" मॉड्यूल कैसे काम करता है - लोडिंग प्रागमा और अन्य मॉड्यूल

बाद मैं एक और मॉड्यूल uni::perl बुलाया पाया CPAN खोज एक सा, क्या वास्तव में जटिल है - यह है और बराबर के लिए:

use strict; 
use feature qw(say state switch); 
no warnings; 
use warnings qw(FATAL closed threads internal debugging pack substr malloc 
       unopened portable prototype inplace io pipe unpack regexp 
       deprecated exiting glob digit printf utf8 layer 
       reserved parenthesis taint closure semicolon); 
no warnings qw(exec newline); 
use utf8; 
use open (:utf8 :std); 
use mro 'c3'; 

कोई व्याख्या कर सकते हैं/यह टिप्पणी कैसे अपने काम करता है?

मैंने यहां पूरे कोड को कुछ सेगमेंट में विभाजित किया और मेरे प्रश्नों को जोड़ा, (### के साथ)।

मैं समझता हूं कि इस प्रश्न से वास्तव में लंबा है। लेकिन, इसे छोटे से विभाजित करने में मदद नहीं मिलेगी, क्योंकि संपूर्ण "uni :: perl" मॉड्यूल के बारे में है।

कृपया, समस्याग्रस्त भागों को समझने में मेरी सहायता करें।


package uni::perl; 
use 5.010; 
BEGIN { 
    ### OK - these are bitmask of different warnings, they're coming from: 
    # paste this into perl to find bitmask 
    # no warnings; 
    # use warnings qw(FATAL closed threads internal debugging pack substr malloc unopened portable prototype 
    #     inplace io pipe unpack regexp deprecated exiting glob digit printf 
    #     utf8 layer reserved parenthesis taint closure semicolon); 
    # no warnings qw(exec newline); 
    # BEGIN { warn join "", map "\\x$_", unpack "(H2)*", ${^WARNING_BITS}; exit 0 }; 

    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 
    $^H |= 0x00000602; ### this mean "use strict;" 
} 

सीधे ${^WARNING_BITS} एक $^H स्थापना, एक आम की तुलना में तेजी है "सख्त का उपयोग करें" और आदि?


यह m{ }x क्या कर रहा है।

m{ 
use strict; 
use warnings; 
}x; 
use mro(); 

मैं "मैच" ऑपरेटर और 'एक्स' झंडा लेकिन समझ में नहीं आता क्या इस संदर्भ में क्या कर रहा है पता है .. use mro कुछ "काले जादू" शायद एक आम पर्ल उपयोगकर्ताओं को पता करने की जरूरत नहीं है क्या ...;


local *__ANON__ लाइन क्या है? इस संदर्भ में goto क्या अच्छा है? पूरा अगला BEGIN ब्लॉक मेरे लिए एक अंधेरा जादू है। ।; (

BEGIN { 
    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *$sub = sub { ### for what need replace the global *croak (etc) with this sub? 
      my $caller = caller; 
      local *__ANON__ = $caller .'::'. $sub; ### what's mean this? 
      require Carp; 

        ### This set the Carp code-refs to the global namespace? 
        ### But who is the "caller" in the BEGIN block? (compile time) 

      *{ $caller.'::'.$sub } = \&{ 'Carp::'.$sub }; 

      goto &{ 'Carp::'.$sub }; ### Why need goto here? 
     }; 
    } 
} 

अंत में - कुछ स्पष्ट बातें import तो पुनर्लेखन, इस कॉल किया जाएगा use uni::perl;

sub import { 
    my $me = shift; 
    my $caller = caller; 

    ### OK - again the bitmasks 
    ${^WARNING_BITS} ^= ${^WARNING_BITS}^"\xfc\x3f\xf3\x00\x0f\xf3\xcf\xc0\xf3\xfc\x33\x03"; 


    ### where are these documented? 
    $^H |= 
      0x00000602 # strict 
     | 0x00800000 # utf8 
    ; 

    # use feature 
    $^H{feature_switch} = 
    $^H{feature_say} = 
    $^H{feature_state} = 1; 

    # use mro 'c3'; 
    mro::set_mro($caller, 'c3'); 

    #use open (:utf8 :std); 
    ${^OPEN} = ":utf8\0:utf8"; 
    binmode(STDIN, ":utf8"); 
    binmode(STDOUT, ":utf8"); 
    binmode(STDERR, ":utf8"); 


    ### again coderef magic. As I understand it - it will replace the 
    ### "carp, etc" in the callers namespace with the coderef's defined 
    ### in the above BEGIN block. But why with this complicated way? 

    for my $sub (qw(carp croak confess)) { 
     no strict 'refs'; 
     *{ $caller .'::'. $sub } = \&$sub; 
    } 

    ### and finally - I have abosolutely no idea - what do the next code 
    ### will take arguments of "use uni::perl qw(arg)" 
    ### but have no idea how to use it - or what is doing ;(
    while (@_) { 
     my $feature = shift; 
     if ($feature =~ s/^://) { 
      my $package = $me. '::'. $feature; 
      eval "require $package; 1" or croak("[email protected]"); 
      $package->load($caller); 
     } 
    } 
} 

क्या कर रहा है पिछले while

प्लस प्रश्न:

  • वही चीज़ें दो बार क्यों करते हैं? एक बार ब्लॉक में और एक बार आयात में? क्योंकि इस सवाल का अधिक भागों, प्रासंगिक हिस्सा है जब आप एक जवाब दे रही है कृपया, बोली लेकिन क्यों भी "प्रारंभ करें" ब्लॉक में लगभग ही बात कर

- (आयात "का उपयोग" के लिए है?।

आपको सभी को धन्यवाद।

उत्तर

3
  1. सीधे चेतावनी बिट्स की स्थापना एक सा तेजी से होता है, और अधिक उम्मीद के मुताबिक व्यवहार है (आप सब कुछ देख सकते हैं कि होना चाहिए), लेकिन यह स्पष्ट रूप से बहुत कठिन साथ काम करते हैं और बनाए रखने के लिए है। यह हो सकता है कि uni::perl चेतावनियों का सेट बिटमैस्क के माध्यम से लोड करना आसान है।

  2. m{ use strict; use warnings;}x; शून्य संदर्भ में बस एक रेगेक्स है। यह चेतावनी सक्षम होने पर या तो संदर्भ के बारे में त्रुटि या $_ सेट नहीं किया जाएगा। मुझे यकीन नहीं है कि यह क्यों किया जा रहा है, यह कुछ कोड मीट्रिक सिस्टम को प्रसन्न करने के लिए हो सकता है जो "चेतावनियों का उपयोग करें; सख्त उपयोग करें" पंक्तियों को देखता है। मैं शायद इसे q{...} if 0; लिखा होगा जो कम से कम थोड़ा स्पष्ट है।

  3. यह BEGIN ब्लॉक कार्प में कार्यों के कस्टम संस्करण बना रहा है। यह किसी अज्ञात सबराउटिन का नाम सेट करने के लिए local *__ANON__ = ... लाइन का उपयोग कर रहा है ताकि कार्प स्टैक ट्रेस का पालन करना आसान हो। BEGIN ब्लॉक लपेटा हुआ कार्प रूटीन बनाता है। आयात subroutine कॉलर के नामस्थान में इन नए लपेटा दिनचर्या लोड करता है।

  4. पिछली बार uni::perl के लिए अतिरिक्त प्लगइन मॉड्यूल लोड होने लगते हैं।

  5. वही काम नहीं किया जा रहा है, # 3 का जवाब देखें। (BEGIN लपेटा हुआ दिनचर्या बनाता है, import उन्हें कॉलर की जगह में स्थापित करता है)

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