2010-04-15 18 views
15

मुझे पता है कि एक चर का उपयोग पर्ल में पैकेज चर के लिए चर नाम के रूप में करना संभव है। मैं एक चर के एक मॉड्यूल नाम के रूप में सामग्री का उपयोग करना चाहता हूँ। उदाहरण के लिए:पर्ल में मॉड्यूल नाम के रूप में मैं चर का उपयोग कैसे कर सकता हूं?

package Foo; 
our @names =("blah1", "blah2"); 
1; 

और एक और फाइल में मैं सक्षम होना चाहते हैं एक अदिश के लिए "foo" की सामग्री को निर्धारित करने और फिर कि अदिश के माध्यम से Foo में नाम सरणी का उपयोग कर सकेंगे। मैं जानता हूँ कि मैं उपयोग कर सकते हैं

my $names = eval '$'. $packageName . "::names" 

लेकिन तभी जब Foo::names एक अदिश है

@{$packageName}::names; #This obviously doesn't work. 

:

my $packageName = "Foo"; 

अनिवार्य रूप से मैं की तर्ज पर कुछ करना चाहता हूँ। eval कथन के बिना ऐसा करने का कोई और तरीका है?

+0

"एक्सेस फू" का क्या मतलब है? – Ether

+0

प्रश्न संपादित किया गया। मैं foo – mjn12

उत्तर

14

पैकेज $package में पैकेज चर पर पाने के लिए आपको प्रतीकात्मक उपयोग कर सकते हैं संदर्भ:

no strict 'refs'; 
my $package = 'Foo'; 

# grab @Foo::names 
my @names = @{ $package . '::names' } 

एक बेहतर तरीका है, जो प्रतीकात्मक संदर्भ से बचा जाता है, Foo के भीतर एक विधि है कि सरणी वापस आ जाएगी बेनकाब करने के लिए है। यह काम करता है क्योंकि विधि आमंत्रण ऑपरेटर (->) invocant के रूप में एक स्ट्रिंग ले सकते हैं।

package Foo; 

our @names = (...); 
sub get_names { 
    return @names; 
} 

package main; 
use strict; 

my $package = 'Foo'; 
my @names = $package->get_names; 
+0

get_names पर कोई अभिभावक नहीं है? –

+0

मुझे लगता है कि मुझे आपके द्वारा वर्णित वैकल्पिक विधि पसंद है, जब तक मैं फू के बेस क्लास में get_names को परिभाषित कर सकता हूं (हम इसे बार बार मूल कहेंगे) इस तरह से मैं बार से विरासत में आने वाले प्रत्येक वर्ग में @ नामों को परिभाषित कर सकता हूं। मैं मूस ऑब्जेक्ट्स का उपयोग कर रहा हूं अगर इससे कोई फर्क पड़ता है। – mjn12

+1

@ पॉल, यदि कोई तर्क नहीं है तो विधि कॉल पर माता-पिता की आवश्यकता नहीं है। कुछ लोग हमेशा स्थिरता के लिए खाली '() 'शामिल करना पसंद करते हैं, लेकिन अगर मैं कर सकता हूं तो मैं आम तौर पर उन्हें बाहर छोड़ देता हूं। – friedo

4

Strict checking एक नाम के हिस्से के रूप में एक चर (या शाब्दिक स्ट्रिंग) का उपयोग करने से रोक रहा है, लेकिन यह स्थानीय स्तर पर निष्क्रिय किया जा सकता:

my @values; 
{ 
    no strict 'refs'; 
    @values = @{"Mypackage"}::var; 
} 
+0

के भीतर पैकेज वैरिएबल "@names" तक पहुंचने में सक्षम होना चाहता हूं अनिवार्य रूप से मैं जो कर रहा हूं वह * .pm के लिए निर्देशिका को ग्लोबबिंग कर रहा है और फिर प्रत्येक फ़ाइल के लिए मुझे लगता है कि मुझे $ फ़ाइल नाम की आवश्यकता है। एक बार उन मॉड्यूल लोड हो जाने के बाद मुझे प्रत्येक पैकेज के अंदर परिभाषित @ नाम परिवर्तक तक पहुंचने की आवश्यकता होती है। मैं रनटाइम तक पैकेज का नाम नहीं जानता, मेरे पास एक वैरिएबल है जिसमें पैकेज का नाम होगा। – mjn12

+0

मुझे एक चर नाम से पैकेज लोड करने में कोई समस्या नहीं है - मुझे वह हिस्सा मिल गया है। यह उन संकुलों के भीतर चर का उपयोग कर रहा है। यह जवाब निश्चित रूप से मुझे एक घंटे पहले बहुत गुजर रहा होगा हालांकि :) – mjn12

+0

@mjn: ओह क्षमा करें, मैं असली मुद्दा को और अधिक प्रमुख बनाने के लिए अब अपना उत्तर संपादित कर रहा हूं :) – Ether

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

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