2010-02-23 6 views
6

मैं एक शामिल मॉड्यूल का पूरा फ़ाइल नाम प्राप्त करना चाहता हूं।क्या% INC प्लेटफ़ॉर्म-निर्भर की कुंजी और मान हैं या नहीं?

package MyTest; 

my $path = join '/', split /::/, __PACKAGE__; 
$path .= ".pm"; 

print "$INC{$path}\n"; 

1; 

$ perl -Ipath/to/module -MMyTest -e0 
path/to/module/MyTest.pm 

यह सभी प्लेटफार्मों पर काम करेगा: इस कोड पर विचार करें?

perlvar

हैश %INC प्रत्येक फ़ाइल नाम do, require, या use ऑपरेटरों के माध्यम से शामिल के लिए प्रविष्टियां नहीं हैं। कुंजी आपके द्वारा निर्दिष्ट फ़ाइल नाम है ( मॉड्यूल नाम पथनामों में कनवर्ट किया गया है), और मान फ़ाइल का स्थान है।

क्या ये चाबियाँ प्लेटफ़ॉर्म-निर्भर हैं या नहीं? क्या मुझे File::Spec या क्या उपयोग करना चाहिए? Win32 पर कम से कम ActivePerl \ के बजाय / का उपयोग करता है।

अद्यतन:%INC मूल्यों के बारे में क्या? क्या वे मंच-निर्भर हैं?

+1

आप पथ के साथ क्या करना चाहते हैं? कृपया अधिक संदर्भ प्रदान करें! –

+0

कहें, मैं वहां से अधिक मॉड्यूल शामिल करना चाहता हूं। – codeholic

उत्तर

2

यह देखते हुए कि यह एक मानक मॉड्यूल है, Module::Loaded से दृष्टिकोण के साथ जाना:

sub is_loaded (*) { 
    my $pm  = shift; 
    my $file = __PACKAGE__->_pm_to_file($pm) or return; 

    return $INC{$file} if exists $INC{$file}; 

    return; 
} 

sub _pm_to_file { 
    my $pkg = shift; 
    my $pm = shift or return; 

    my $file = join '/', split '::', $pm; 
    $file .= '.pm'; 

    return $file; 
} 
+1

असल में यह वही कोड है जिसे मैंने लिखा था। और ऐसा लगता है कि यह मॉड्यूल अधिकांश प्लेटफार्मों पर काम करता है। धन्यवाद। http://www.cpantesters.org/distro/M/Module-Loaded.html#Module-Loaded-0.06 क्या आप '% INC' मानों की पोर्टेबिलिटी के बारे में कुछ भी कह सकते हैं? – codeholic

+2

@codeholic आप कौन सा प्लेटफॉर्म ध्यान में रखते हैं? याद रखें कि '/' Win32 पर एक वैध पथ विभाजक है, और अप्रिय डबल-बैकवॉक्स की तुलना में बहुत अच्छा दिख रहा है। Windows कमांड खोल के geb0rken * इंटरफ़ेस को न दें * आपको गुमराह करें। –

+1

मैं जितना संभव हो सके क्रॉस-प्लेटफ़ॉर्म कोड बनाना चाहता हूं, क्योंकि मैं इसे अंततः सीपीएएन पर पोस्ट करने की उम्मीद कर रहा हूं। – codeholic

1

यहाँ एक यथोचित मजबूत कार्यान्वयन कि भी मॉड्यूल है कि अभी तक लोड नहीं किया गया है के लिए काम करता रहेगा।

use File::Find; 
use File::Spec; 

sub pkg2path (*) { 
    my $file = join '[\\\/:]' => 
       map "\Q$_" => 
       split /::|'/ => "$_[0].pm";   # ' 

    /$file$/ and return File::Spec->rel2abs($INC{$_}) 
     for keys %INC; 

    # omit the rest to only find loaded modules 

    my $path; find { 
     no_chdir => 1, 
     wanted => sub { 
      $path = $_ and goto found if /$file$/ 
     } 
    } => @INC; 

    found: File::Spec->rel2abs($path or return) 
} 

say pkg2path Benchmark; 
say pkg2path Devel::Trace; 
+0

वही कोड 'मॉड्यूल :: ढूँढें' में बेहतर लिखा गया है। लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। – codeholic

+0

pkg2path की पहली पंक्ति का आपका जवाब है। नहीं, यह विश्वास करने के लिए सुरक्षित नहीं है कि% INC में प्रविष्टियों का एक विशेष पैटर्न होगा (यदि केवल इसलिए कि% INC उपयोगकर्ता लिखने योग्य है)। यही कारण है कि मैंने रेगेक्स बिल्डर लिखा (जो मॉड्यूल :: फाइंड में नहीं मिला है, और यह% INC btw का भी उपयोग नहीं करता है)। यह जानकर अच्छा लगा कि आप उन लोगों की सराहना करते हैं जिन्होंने आपके प्रश्न के बारे में सोचने और जवाब देने का समय लिया था –

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