2009-03-25 30 views
7

मेरे पास स्क्रिप्ट का एक गुच्छा है जो टूल प्रवाह चलाता है। एक मेकफ़ाइल की तरह लेकिन पर्ल में करता है।मैं% ENV में परिवर्तन कैसे प्राप्त कर सकता हूं?

उन प्रवाहों के हिस्से के रूप में, पर्ल स्क्रिप्ट ने पर्यावरण के युद्ध निर्धारित किए हैं और जब यह होता है तो यह जानना हमेशा आसान नहीं होता है और इसलिए प्रवाह के अलग-अलग चरणों को पुन: पेश करना मुश्किल हो सकता है।

क्या एनएनवी में हुक करने का कोई तरीका है कि जब पर्यावरण बदलता है तो मैं कॉलबैक पंजीकृत कर सकता हूं?

क्या मैं बस इसे टाई कर सकता हूं? % एनएनवी पहले से ही टाई की तरह व्यवहार कर रहा है।

अनुवर्ती: हाँ। आप बस इसे टाई।

उत्तर

4

यह करने योग्य है। मुझे लगता है कि नीचे करने के लिए शायद एक प्रदर्शन जुर्माना है, और मुझे यकीन है कि मैंने सभी संभावित मामलों को शामिल नहीं किया है, लेकिन यह निश्चित रूप से आपको शुरू करना चाहिए।

use strict; 
use warnings; 

tie %ENV, 'change_noticer', %ENV or die $!; 

$ENV{PATH} .= ":test"; 
print $ENV{PATH}, "\n"; 
delete $ENV{PATH}; 

package change_noticer; 

use strict; 
use warnings; 
use Carp; 
use Tie::Hash; 
use base 'Tie::StdHash'; 

sub DELETE { 
    my $this = shift; 

    carp "deleting \$ENV{$_[0]}"; 
    $this->SUPER::DELETE(@_); 
} 

sub STORE { 
    my $this = shift; 

    carp "altering \$ENV{$_[0]}"; 
    $this->SUPER::STORE(@_); 
} 

sub TIEHASH { 
    my $class = shift; 
    my $this = bless {}, $class; 

    while(my ($k,$v) = splice @_, 0, 2) { 
     $this->{$k} = $v; 
    } 

    return $this; 
} 
+0

हम्म। अच्छा लगा। यदि यह काम करता है, तो ऐसा लगता है कि% ENV के बारे में जादुई एकमात्र चीज यह नहीं है कि यह कैसे कार्यान्वित किया जाता है (यह केवल एक साधारण हैश है), लेकिन यह चीजों द्वारा "char * env []" सरणी बनाने के लिए संदर्भित है जो बाहरी प्रक्रियाओं को शुरू करता है। – Roboprog

1

एकमात्र चीज जिसे मैं सोच सकता हूं वह %ENVIRONMENT नामक एक बंधे हुए चर को बनाना है जो %ENV पर इंटरफ़ेस के रूप में कार्य करता है जिसे आप हुक कर सकते हैं। फिर यह सुनिश्चित करें कि आप हमेशा %ENV के बजाय %ENVIRONMENT का उपयोग करें।

+0

हम्म। मैं थोड़े मौजूदा कोड को फिर से भरने में सक्षम होना चाहता हूं। ये प्रवाह बहुत रहस्यमय हो सकते हैं – mmccoo

+0

ठीक है, सवाल तब बन जाता है, स्ट्रिंग ENV आपके कोड में कितनी बार दिखाई देता है? उम्मीद है कि अक्सर नहीं। फिर आप फ़ाइलों पर एक वैश्विक खोज प्रतिस्थापित कर सकते हैं और शीर्ष पर एक BEGIN ब्लॉक में टाई जोड़ सकते हैं। –

9

ओउ। मैं बस अपना बट घुमाया। वैसे भी, एक मॉनिटर पैकेज मौजूद है जो आपको मौजूदा चर के लिए टाई के माध्यम से परिवर्तनों की निगरानी करने देता है। यह एक दिलचस्प समस्या की तरह लग रहा था, इसलिए जब मैंने ब्लू कैमल में "टाई" दस्तावेज में खोदना शुरू किया, तो मौजूदा चर के साथ क्या होता है इसके बारे में कोई परिभाषा नहीं थी (यानी - कोई संदर्भ कहीं से बचाया गया है?)। इसलिए, मैं "perl टाई" मौजूदा चर "" के लिए googled। दुर्भाग्य से, जो लिंक मैंने पाया वह सामाजिक रूप से अस्वीकार्य (समुद्री डाकू सामग्री) था, इसलिए मुझे अस्तित्व से प्रतिष्ठित रूप से बहुत अधिक थप्पड़ मारा गया।

शुभकामनाएं, हालांकि।

वैसे भी, स्पष्ट करने के लिए, यह "उन्नत पर्ल प्रोग्रामिंग" के अध्याय 9 में है, "टाई" पर अध्याय। सुनिश्चित करें कि आप अपनी प्रतिलिपि एक प्रतिष्ठित साइट से खरीदते हैं :-)

+0

मैंने एसओ से एक सवाल पोस्ट किया कि क्या किया जाना चाहिए और आप साइबर-लिंच भीड़ का शिकार थे। सिरिरम ने सीपीएएन पर http://charch.cpan.org/~sriram/examples/ पर उस पुस्तक से अपने उदाहरण दिए हैं और यहां उदाहरण के लिए सीधा लिंक है http://cpansearch.perl.org/src/SRIRAM/examples/ टाई/Monitor.pm –

+0

अपना उत्तर संपादित करें और मैं आपको +1 के साथ वापस अपने रास्ते पर शुरू करूंगा।बीटीडब्ल्यू पुस्तक के लिए सबसे अच्छे लिंक हैं http://oreilly.com/catalog/9780596004569/ (द्वितीय संस्करण) और http://oreilly.com/catalog/9781565922204/ (पहला संस्करण)। कुछ रिकवरी के लिए –

+0

+1, और मैंने पुस्तक को स्पष्ट करने के लिए संपादित किया। मेरे उन्नत पर्ल प्रोग्रामिंग में कोलोफोन एक काला तेंदुए है। ब्लू कैमल प्रोग्रामिंग पर्ल है (ऊंट काला है, हालांकि पुस्तक में नीली बाध्यकारी है)। – paxdiablo

2

Variable::Magic काम करने के लिए, हालांकि, एक बंधे हैश के विपरीत, यह आप मूल्य देने के लिए प्रतीत नहीं होता है।

use 5.010; 
use Carp   qw<carp>; 
use Variable::Magic qw<cast wizard>; 

my $magic_hash = wizard store => sub { 
    carp "Hey! They're trying to set $_[-1]!"; 
}; 

cast %ENV, $magic_hash; 

$ENV{HOME} = '~evilhacker'; 

और अगर मैं बाद में पता शैल, यह ठीक से वातावरण चर सेट करने के लिए लगता है, इसलिए मैं सिर्फ %ENV पीटना नहीं किया:

say `echo HOME=\$HOME`; 
say `echo HOME=%HOME%`; 
1

एक और बात करने की कोशिश करना, लाइनों के बीच पढ़ने: बजाय कार्यों को चलाने के लिए "सिस्टम (...)" को कॉल करने के लिए, "my_system (...)" को कार्यान्वित करें जो बाह्य कार्य को कॉल करने से पहले पर्यावरण को प्रिंट करता है, ताकि आप किसी एक कार्य को फिर से बना सकें कमांड लाइन

से कमांड लाइन "env ..." कमांड 0
# show the environment in which an external command runs: 
sub my_system 
    { 
    print map { $_ . "='" . $ENV{ $_ } . "'\n" } keys(%ENV); 
    print "'" . join("' '", @_) . "'\n"; 
    return system(@_); 
    } 
संबंधित मुद्दे