2009-09-17 19 views
8

निम्नलिखित पर्ल कोड ..यदि मैं विंडोज पर हूं तो मैं सशर्त रूप से पर्ल मॉड्यूल का उपयोग कैसे करूं?

if ($^O eq "MSWin32") { 
    use Win32;                                               
    .. do windows specific stuff .. 
} 

.. Windows के तहत काम करता है, लेकिन अन्य सभी प्लेटफार्मों के अंतर्गत चलाने में विफल रहता है ("@INC में Win32.pm पता नहीं लगा सकता")। मैं विंडोज के तहत चलते समय केवल Win32 आयात करने का प्रयास करने के लिए पर्ल को कैसे निर्देश दूं, और अन्य सभी प्लेटफॉर्म के तहत आयात विवरण को अनदेखा कर सकता हूं?

उत्तर

20

इस कोड को सभी परिस्थितियों में काम करेंगे, और यह भी संकलन समय पर लोड करता है, अन्य मॉड्यूल आप उस पर निर्भर हो सकता है के रूप में निर्माण कर रहे हैं:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Module; 
     Module->import(); # assuming you would not be passing arguments to "use Module" 
    } 
} 

इसका कारण यह है use Module (qw(foo bar))BEGIN { require Module; Module->import(qw(foo bar)); } के बराबर के रूप में वर्णित है perldoc -f use में।

(संपादित करें, कुछ साल बाद ...)

यह और भी बेहतर है, हालांकि यह है:

use if $^O eq "MSWin32", Module; 

if pragma here बारे में अधिक पढ़ें।

+0

अरे, ईथर ने मुझे मार दिया! – singingfish

+0

* 'बेयरवर्ड "मॉड्यूल" उपयोग में "सख्त सब" के दौरान अनुमति नहीं है ... '* - यह दूरी से बहुत अच्छा लग रहा था .... – jww

+0

@jww आपको वास्तविक मॉड्यूल नाम से" मॉड्यूल "को प्रतिस्थापित करना होगा लोड करना चाहते हैं। और उस नामस्थान को 'पैकेज' कथन के साथ फ़ाइल में घोषित करने की आवश्यकता है। – Ether

3

सामान्य रूप से, use Module या use Module LIST का संकलन समय पर मूल्यांकन किया जाता है चाहे वे कोड में कहां दिखाई दें। क्रम बराबर require नहीं है

require Module; 
Module->import(LIST) 
1

require Module;

लेकिन use भी कॉल import है। इसलिए, यदि मॉड्यूल डिफ़ॉल्ट नामस्थान पर निर्यात करता है, तो आपको

import Module qw(stuff_to_import) पर भी कॉल करना चाहिए;

आप eval "use Module" भी कर सकते हैं - जो महान काम करता है IF perl रनटाइम पर उचित पथ पा सकता है।

+6

अप्रत्यक्ष विधि कॉल का प्रयोग न करें, वे एक लंबे शॉट से उत्तम आचरण नहीं हैं। 'मॉड्यूल-> आयात करें (qw (सामान));' इसके बजाए। – Danny

11

अनुक्रम के लिए एक शॉर्टकट के रूप में:

BEGIN { 
    if ($^O eq "MSWin32") 
    { 
     require Win32; 
     Win32::->import(); # or ...->import(your-args); if you passed import arguments to use Win32 
    } 
} 

आप अगर pragma उपयोग कर सकते हैं:

use if $^O eq "MSWin32", "Win32"; # or ..."Win32", your-args; 
संबंधित मुद्दे

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