2009-07-31 19 views
5

मैं पर्ल, निम्नलिखित रूबी कोड के बराबर में क्या करना चाहते हैं:मैं पर्ल में स्थिर के रूप में एक नेस्टेड हैश कैसे बना सकता हूं?

class Foo 
    MY_CONST = { 
    'foo' => 'bar', 
    'baz' => { 
     'innerbar' => 'bleh' 
    }, 
    } 

    def some_method 
    a = MY_CONST[ 'foo' ] 
    end 

end 

# In some other file which uses Foo... 

b = Foo::MY_CONST[ 'baz' ][ 'innerbar' ] 

है यही कारण है कि, मैं सिर्फ कक्षा में और बाहर दोनों के उपयोग के लिए एक स्थिर, नेस्टेड हैश संरचना की घोषणा करना चाहते हैं। कैसे?

+0

मैं पहले ही अपनी पर्ल वर्ग की स्थापना की है (आशीर्वाद के साथ , इत्यादि), इसलिए मुझे यह दिखाने की ज़रूरत नहीं है कि यह कैसे करें। – Pistos

उत्तर

8

आप हैश (कुंजी, मान, या दोनों) को लॉक और अनलॉक करने के लिए Hash::Util मॉड्यूल का उपयोग कर सकते हैं।

package Foo; 
use Hash::Util; 

our %MY_CONST = (
    foo => 'bar', 
    baz => { 
     innerbar => 'bleh', 
    } 
); 

Hash::Util::lock_hash_recurse(%MY_CONST); 

फिर कुछ अन्य फ़ाइल में:

use Foo; 
my $b = $Foo::MY_CONST{baz}{innerbar}; 
+0

धन्यवाद, माइकल, यह वही है जो मुझे चाहिए। मैंने lock_hashref का उपयोग करने की कोशिश की, लेकिन ऐसा लगता है कि यह मेरे लिए परिभाषित नहीं है, लेकिन यह ठीक है, मैं lock_hash के साथ कर सकता हूं। – Pistos

+0

मुझे पता है कि मैं बस "हमारे" के साथ जो कुछ चाहिए उसे पूरा कर सकता हूं, मुझे हैश :: की आवश्यकता नहीं है। मैं इस तथ्य के बाद हैश के साथ गड़बड़ करने वाले अन्य लोगों से चिंतित नहीं हूं, मुझे बस यह जानने की जरूरत है कि पर्ल में एक सुलभ स्थिरता को कैसे परिभाषित किया जाए। आपके उदाहरण कोड ने मुझे दिखाया। – Pistos

+2

तो आपको वास्तव में स्थिरता की आवश्यकता नहीं है? हैश :: सामान तक सामान वह जादू है जो लोगों को हैश बदलने से रोकता है। –

1

यहाँ पर्ल में हैश के लिए एक गाइड है। Hash of Hashes

+0

धन्यवाद, हालांकि मैंने पर्ल में सामान्य रूप से नेस्टेड हैश बनाया है। मेरी विशिष्ट आवश्यकता को पैकेज/कक्षा के अंदर और बाहर दोनों का उपयोग करने के साथ करना है। – Pistos

4

Readonly देखें:

#!/usr/bin/perl 

package Foo; 

use strict; 
use warnings; 

use Readonly; 

Readonly::Hash our %h => (
    a => { b => 1 } 
); 

package main; 

use strict; 
use warnings; 

print $Foo::h{a}->{b}, "\n"; 

$h{a}->{b} = 2; 

आउटपुट:

 
C:\Temp> t 
1 
Modification of a read-only value attempted at C:\Temp\t.pl line 21 
+0

रीडोनली उस सिस्टम पर स्थापित नहीं है जिसका मैं उपयोग कर रहा हूं, और मुझे नए मॉड्यूल को स्वतंत्र रूप से स्थापित करने की स्वतंत्रता नहीं है। लेकिन आपके सुझाव के लिए धन्यवाद। जब मैं गुगल रहा था तब मैं आया था। – Pistos

+4

@Pistos http://perldoc.perl.org/perlfaq8.html#How-do-I-keep-my-own-module/library-directory%3F –

+0

@Sinan: धन्यवाद, लेकिन यह मेरी मदद नहीं करता है मामला। आप किसी साझा उपयोगकर्ता या साझा करने वाले किसी उपयोगकर्ता के लिए मेरी परिस्थितियों को गलत बना सकते हैं। बाधाएं तकनीकी नहीं हैं, वे सामाजिक/राजनीतिक/प्रबंधकीय हैं। :) – Pistos

11

तुम भी यह पूरी तरह builtins के साथ क्या कर सकते हैं:

package Foo; 
use constant MY_CONST => 
{ 
    'foo' => 'bar', 
    'baz' => { 
     'innerbar' => 'bleh', 
    }, 
}; 

sub some_method 
{ 
    # presumably $a is defined somewhere else... 
    # or perhaps you mean to dereference a parameter passed in? 
    # in that case, use ${$_[0]} = MY_CONST->{foo} and call some_method(\$var); 
    $a = MY_CONST->{foo}; 
} 

package Main; # or any other namespace that isn't Foo... 
# ... 
my $b = Foo->MY_CONST->{baz}{innerbar}; 
+1

धन्यवाद, ईथर। मैं इस वाक्यविन्यास के साथ जाने जा रहा हूं, क्योंकि यह मुझे लगातार हर जगह संदर्भों का उपयोग करने देता है। मैं आपका स्वीकार्य उत्तर के रूप में चिह्नित करूंगा, लेकिन यह बहुत देर हो चुकी है। :) – Pistos

+0

हैश :: उपयोग :: lock_hash_recurse एक अच्छा समाधान है, लेकिन मुझे अंतर्निहित समाधान पसंद है। –

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