2012-05-21 35 views
8

Tôi là một noob.I cần một số kiến ​​thức cơ bản về cách lưu dữ liệu và đọc theo perl. Nói để lưu một băm và một mảng. Định dạng (mở rộng) của tệp nào nên được sử dụng? txt? Cho đến nay tôi chỉ có thể lưu tất cả mọi thứ dưới dạng chuỗi print FILE %hash và đọc lại chúng dưới dạng chuỗi print <FILE>. Tôi nên làm gì nếu tôi cần hàm băm và mảng của hàm từ một tệp. Làm thế nào để đưa chúng trở lại băm và mảng?Lưu trữ và đọc băm và mảng trong các tệp trong Perl

+3

Bạn có thể xem các mô-đun như [Storable] (http://search.cpan.org/perldoc?Storable) hoặc [Data :: Dumper] (http://search.cpan.org/perldoc?Data: : Dumper). – TLP

+1

** Dữ liệu :: Dumper ** sẽ giúp bạn lưu trữ mảng/băm như vậy. Bạn có thể sử dụng lại chúng thông qua ** require/eval ** – tuxuday

Trả lời

19

Bạn đang tìm kiếm dữ liệu serialization. Các lựa chọn phổ biến mạnh mẽ là Sereal, JSON::XSYAML::XS. Các định dạng ít được biết đến là: ASN.1, Avro, BERT, BSON, CBOR, JSYNC, MessagePack, Protocol Buffers, Thrift.

khác lựa chọn thường được đề cập là StorableData::Dumper (hoặc tương đương)/eval, nhưng tôi không thể khuyên họ bởi vì định dạng storable là Perl phiên bản phụ thuộc, và eval là không an toàn vì nó thực thi mã nhị phân. Tính đến năm 2012, bộ phận phân tích cú pháp Data::Undump vẫn chưa tiến triển rất xa. Tôi cũng không thể khuyên bạn nên sử dụng XML vì nó không ánh xạ tốt các loại dữ liệu Perl và có nhiều lược đồ cạnh tranh/không tương thích làm thế nào để dịch giữa XML và dữ liệu.


ví dụ Mã (thử nghiệm):

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 }; 
} 

Bước tiếp theo lên khỏi đây là object persistence.


Cũng đọc: Serializers for Perl: when to use what

+0

Bài đăng hay, daxim. +1. Nhiều, rất nhiều. :) – verisimilitude

+0

tài nguyên tuyệt vời. Cảm ơn. –

1

Điều này thực sự phụ thuộc vào cách bạn muốn lưu trữ dữ liệu của bạn trong tập tin của bạn. Tôi sẽ cố gắng viết một số mã perl cơ bản để cho phép bạn đọc một tệp vào một mảng và hoặc viết lại một băm vào một tệp.

#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

Vâng. sử dụng mô-đun CPAN hiện tại sẽ phù hợp hơn là mã thô. – verisimilitude

+0

Xin lỗi. Tôi có nghĩa là để đăng nó như là một bình luận ở đó. – verisimilitude

+0

Thú vị và hữu ích. Cách tiếp cận này có giá trị trong một số môi trường nơi các mô-đun không dễ cài đặt. Tôi đồng ý một cách tiếp cận ưa thích sẽ được sử dụng dữ liệu :: Dumper (mà đã đi một chặng đường dài trong những năm gần đây) hoặc mô-đun khác. –

0

Nếu bạn mới tôi chỉ đề nghị làm cho chuỗi từ mảng/băm với join() và họ viết nó với "in" và sau đó đọc và sử dụng split() để làm cho mảng/băm một lần nữa. Đó sẽ là cách đơn giản hơn như ví dụ về sách giáo khoa của Perl.

+0

và nhược điểm là gì? –

+0

Có thể khó giải quyết một vấn đề phức tạp hơn mảng hoặc băm (ví dụ: mảng đa chiều). –

Các vấn đề liên quan