2013-05-09 5 views
12

तो मान लें कि मेरे पास main.pl स्क्रिप्ट है और उस स्क्रिप्ट में मुझे कुछ चर (किसी प्रकार का चर स्थिर या सामान्य) घोषित करने की आवश्यकता है और उन चरों को उन सभी स्क्रिप्ट्स और मॉड्यूल के माध्यम से उपलब्ध होने की आवश्यकता है जिन्हें मैं main.pl स्क्रिप्ट से शामिल करूंगा खुद ब खुद।पर्ल - सभी स्क्रिप्ट और मॉड्यूल में उपलब्ध वैश्विक चर?

अगर मैं main.pl में एक चर $myVar है और main.pl से मैं script1.pl, script2.pl या script3.pm, और उन लिपियों मैं $myVar उपयोग करने के लिए के रूप में आप किसी भी वर कि विशिष्ट स्क्रिप्ट या मॉड्यूल में परिभाषित का उपयोग होगा की जरूरत है की किसी से की आवश्यकता होती है क्या मतलब मैं ।

मैंने नेट पर खोज की है, लेकिन मुझे केवल उदाहरण मिल गए हैं जहां आप स्क्रिप्ट से वेरिएबल्स एक्सेस कर सकते हैं या मॉड्यूल से चर निकाल सकते हैं; लेकिन यह वही नहीं है जो मैं चाहता हूं।

क्या PHP में कोई कीवर्ड नहीं है जहां आप मूल स्क्रिप्ट से चर का उपयोग करने के लिए global $var1, $var2 आदि का उपयोग करेंगे?

कोई भी उदाहरण, दस्तावेज़ीकरण या आलेख स्वीकार्य है - मूल रूप से कुछ भी जो मुझे पूरा करने में मदद कर सकता है जो सहायक होगा।

उत्तर

29

आप our कीवर्ड के साथ वैश्विक चर घोषणा कर सकते हैं:

our $var = 42; 

प्रत्येक वैश्विक चर के पास एक पूर्णतः योग्य नाम है जिसका उपयोग कहीं से भी एक्सेस करने के लिए किया जा सकता है। पूरा नाम पैकेज नाम प्लस परिवर्तनीय नाम है। यदि आपने अभी तक उस समय एक पैकेज घोषित नहीं किया है, तो आप पैकेज main पैकेज में हैं, जिसे एक अग्रणी :: पर छोटा किया जा सकता है। तो ऊपर चर नाम

$var  # inside package main 
$main::var # This is most obvious 
$::var  # This may be a good compromise 

हम एक और पैकेज का इस्तेमाल किया था, तो है, उपसर्ग बदल जाएगा, उदा

package Foo; 
our $bar = "baz"; 
# $Foo::bar from anywhere, 
# or even $::Foo::bar or $main::Foo::bar 

हम उपसर्ग के बिना एक चर का उपयोग करना चाहते हैं, लेकिन अन्य पैकेजों के तहत, हम इसे निर्यात करने के लिए किया है। यह आमतौर पर Exporter subclassing द्वारा किया जाता है, @Davids उत्तर देखें। हालांकि, यह केवल उन पैकेजों से चर प्रदान कर सकता है जो use डी हैं, दूसरी तरफ नहीं। जैसे

Foo.pm:

package Foo; 
use strict; use warnings; 
use parent 'Exporter'; # imports and subclasses Exporter 

our $var = 42; 
our $not_exported = "don't look at me"; 

our @EXPORT = qw($var); # put stuff here you want to export 
# put vars into @EXPORT_OK that will be exported on request 

1; 

script.pl:

#!/usr/bin/perl 
# this is implicitly package main 
use Foo; # imports $var 

print "var = $var\n"; # access the variable without prefix 
print "$Foo::not_exported\n"; # access non-exported var with full name 

शाब्दिक चर (my साथ घोषित) विश्व में एकमात्र नाम नहीं हैं और उनके स्थिर दायरे से बाहर नहीं पहुँचा जा सकता। उन्हें Exporter के साथ भी उपयोग नहीं किया जा सकता है।

+0

कुछ सोचने के बाद मैंने इस विधि पर स्विच किया ताकि धन्यवाद: डी –

+0

$ :: चाल करेगा – yanger

5

ऐसा करने का सबसे आसान तरीका, अपना स्वयं का मॉड्यूल बनाना होगा। तो, उदाहरण के लिए, अगर मैं चर $foo and $bar करने के लिए वैश्विक पहुँच चाहते हैं, तो मैं, एक मॉड्यूल बना सकते हैं इस प्रकार है:

:

# file: MyVars.pm 
package MyVars; 

$foo = 12; 
$bar = 117.8; 

1; 

तो मैं इन चरों MyVars मॉड्यूल का उपयोग करता है किसी भी पर्ल स्क्रिप्ट का उपयोग कर उपयोग कर सकते हैं

# file: printvars.pl 
use MyVars; 

print "foo = $MyVars::foo\nbar = $MyVars::bar\n"; 

आउटपुट:

foo = 12 
bar = 117.8 
+0

नोट: '@ EXPORT_OK' प्रतीकों को अनुरोध पर निर्यात करने के लिए परिभाषित करता है; आप किसी से अनुरोध नहीं करते हैं। पूरी तरह से योग्य नामों का उपयोग करके, आपको 'निर्यातक' की भी आवश्यकता नहीं है: आपका उदाहरण सभी निर्यातक-संबंधित लाइनों के साथ काम करेगा। – amon

+0

@amon इसे मिला। धन्यवाद। – David

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