2012-05-21 13 views
8

Soy un noob.I necesitan algunos conocimientos básicos sobre cómo los datos deben ser guardados y leen bajo el Perl. Diga que guarde un hash y una matriz. ¿Qué formato (extensión) del archivo debería usarse? ¿TXT? Hasta el momento sólo puedo guardar todas las cosas como cadena print FILE %hash y leer de nuevo como cadena print <FILE>. ¿Qué debo hacer si necesito el hash de funciones y las entradas de matriz de un archivo? ¿Cómo volver a ponerlos en hash y array?tienda y leer hash y matriz en archivos en Perl

+3

Check-out módulos tales como [almacenable] (http://search.cpan.org/perldoc?Storable) o [Data :: Dumper] (http://search.cpan.org/perldoc?Data: : Dumper). – TLP

+1

** ** Datos :: Dumper le ayudará a almacenar Array/hashes tal como es. Puede volver a utilizarlos a través de ** require/eval ** – tuxuday

Respuesta

19

Usted está buscando los datos serialización. Las opciones más populares que son robustos son Sereal, JSON::XS y YAML::XS. formatos menos conocidos son: ASN.1, Avro, BERT, BSON, CBOR, JSYNC, MessagePack, Protocol Buffers, Thrift.

Otras opciones son a menudo mencionados Storable y Data::Dumper (o similar)/eval, pero no se recomiendan porque el formato de almacenable es la versión de Perl dependiente y eval es insegura, ya que ejecuta código arbitrario. A partir de 2012, la contraparte de análisis Data::Undump no ha avanzado mucho. Tampoco puedo recomendar el uso de XML porque no mapea bien los tipos de datos Perl, y existen múltiples esquemas competitivos/incompatibles sobre cómo traducir entre XML y datos.


Ejemplos de código (probado):

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

El siguiente paso después de aquí es object persistence.


Lea también: Serializers for Perl: when to use what

+0

Bonita publicación, daxim. +1. Mucho, mucho apreciable. :) – verisimilitude

+0

excelentes recursos. Gracias. –

1

Esto realmente depende de cómo desea almacenar los datos en el archivo. Trataré de escribir un código de perl básico para que pueda leer un archivo en una matriz o escribir un hash en un archivo.

#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

Sí. usar un módulo de CPAN existente sería más apropiado que código sin procesar. – verisimilitude

+0

Lo siento. Quise publicarlo como un comentario allí. – verisimilitude

+0

Interesante y útil. Este enfoque tiene valor en algunos entornos donde los módulos no son fáciles de instalar. Estoy de acuerdo en que un enfoque preferido sería usar Data :: Dumper (que ha avanzado mucho en los últimos años) u otro módulo. –

0

Si acabo nueva sugieres hacer a la cadena de la matriz/hash con join() y lo escriben con "imprimir" y luego leer y usar split() para hacer arsenal/hash de nuevo. Esa sería una manera más simple como el ejemplo de libro de texto de enseñanza de Perl.

+0

y cuáles serían las desventajas? –

+0

Puede ser difícil lidiar con algo aún más complicado que las matrices o hashes (por ejemplo, matrices multidimensionales). –

Cuestiones relacionadas