2012-05-21 13 views
8

में फाइलों में हैश और सरणी पढ़ मैं एक noob.I के बारे में कैसे डेटा सहेजा और पर्ल के तहत पढ़ा जाना चाहिए कुछ बुनियादी ज्ञान की जरूरत है हूँ। एक हैश और एक सरणी को बचाने के लिए कहें। फ़ाइल का किस प्रारूप (एक्सटेंशन) का उपयोग किया जाना चाहिए? टेक्स्ट? अब तक मैं सिर्फ स्ट्रिंग print FILE %hash के रूप में सभी चीजों को बचाने और उन्हें वापस स्ट्रिंग print <FILE> के रूप में पढ़ सकते हैं। अगर मुझे फ़ाइल से अपने फ़ंक्शन हैश और सरणी इनपुट की आवश्यकता है तो मुझे क्या करना चाहिए। उन्हें वापस हैश और सरणी में कैसे रखा जाए?स्टोर और पर्ल

+3

आप जैसे मॉड्यूल की जाँच कर सकते हैं [Storable] (http://search.cpan.org/perldoc?Storable) या [डाटा :: डम्पर] (http://search.cpan.org/perldoc?Data: : डम्पर)। – TLP

+1

** डेटा :: डम्पर ** आपको सरणी/हैश स्टोर करने में मदद करनी चाहिए। आप ** आवश्यकता/eval ** – tuxuday

उत्तर

19

आप डेटा क्रमबद्धता के लिए देख रहे हैं। लोकप्रिय विकल्पों कि मजबूत होते हैं Sereal, JSON::XS और YAML::XS हैं। कम ज्ञात स्वरूप हैं: ASN.1, Avro, BERT, BSON, CBOR, JSYNC, MessagePack, Protocol Buffers, Thrift

अन्य अक्सर उल्लेख विकल्प Storable और Data::Dumper (या समान)/eval हैं, लेकिन मैं उन्हें सलाह देते हैं नहीं कर सकते क्योंकि Storable के प्रारूप पर्ल संस्करण निर्भर है, और क्योंकि यह मनमाना कोड निष्पादित eval असुरक्षित है। 2012 तक, पार्सिंग काउंटर-पार्ट Data::Undump अभी तक बहुत प्रगति नहीं हुई है। मैं इसलिए भी कि यह पर्ल डेटा प्रकार अच्छी तरह से नक्शा नहीं है XML का उपयोग करने की अनुशंसा नहीं कर सकते हैं, और कई प्रतिस्पर्धा/असंगत स्कीमा कैसे XML और डेटा के बीच अनुवाद करने वहां मौजूद।


कोड उदाहरण (परीक्षण किया):

use JSON::XS qw(encode_json decode_json); 
use File::Slurp qw(read_file write_file); 
my %hash; 
{ 
    my $json = encode_json \%hash; 
    write_file('dump.json', { binmode => ':raw' }, $json); 
} 
{ 
    my $json = read_file('dump.json', { binmode => ':raw' }); 
    %hash = %{ decode_json $json }; 
} 

use YAML::XS qw(Load Dump); 
use File::Slurp qw(read_file write_file); 
my %hash; 
{ 
    my $yaml = Dump \%hash; 
    write_file('dump.yml', { binmode => ':raw' }, $yaml); 
} 
{ 
    my $yaml = read_file('dump.yml', { binmode => ':raw' }); 
    %hash = %{ Load $yaml }; 
} 

अप यहां से अगले कदम object persistence है।


भी पढ़ें: Serializers for Perl: when to use what

+0

अच्छी पोस्ट, daxim के माध्यम से उन्हें फिर से उपयोग कर सकते हैं। +1। बहुत, बहुत सराहनीय। :) – verisimilitude

+0

महान संसाधन। धन्यवाद। –

1

यह वास्तव में कैसे आप अपनी फ़ाइल में डेटा स्टोर करना चाहते हैं पर निर्भर करता है। मैं आपको एक सरणी में फ़ाइल पढ़ने और फ़ाइल में हैश वापस लिखने के लिए सक्षम करने के लिए कुछ बुनियादी पर्ल कोड लिखने का प्रयास करूंगा।

#Load a file into a hash. 
#My Text file has the following format. 
#field1=value1 
#field2=value2 
#<FILE1> is an opens a sample txt file in read-only mode. 
my %hash; 
while (<FILE1>) 
{ 
    chomp; 
    my ($key, $val) = split /=/; 
    $hash{$key} .= exists $hash{$key} ? ",$val" : $val; 
} 
+2

हाँ। मौजूदा सीपीएएन मॉड्यूल का उपयोग कच्चे कोड की बजाय अधिक उपयुक्त होगा। – verisimilitude

+0

क्षमा करें। मैं इसे एक टिप्पणी के रूप में पोस्ट करना चाहता था। – verisimilitude

+0

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

0

आप नए मैं सिर्फ सुझाव है() में शामिल होने के साथ सरणी/हैश से स्ट्रिंग के लिए बनाने के लिए और वे "प्रिंट" के साथ इसे लिखने और फिर पढ़ सकते हैं और विभाजन का उपयोग करते हैं() सरणी/हैश फिर से बनाने के लिए। पर्ल शिक्षण टेक्स्ट बुक उदाहरण जैसे यह अधिक आसान तरीका होगा।

+0

और नुकसान क्या होगा? –

+0

सरणी या हैश (उदा। बहुआयामी सरणी) से कहीं अधिक जटिल से निपटना मुश्किल हो सकता है। –

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