Almacene y lea hash y array en archivos en Perl

Soy novato. Necesito algunos conocimientos básicos sobre cómo se deben guardar los datos y cómo leerlos en Perl. Diga que guarde un hash y una matriz. ¿Qué formato (extensión) del archivo debería usarse? ¿TXT? Hasta ahora solo puedo guardar todas las cosas como una cadena de caracteres que print FILE %hash y las leo de nuevo como una cadena de caracteres print . ¿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?

Está buscando la serialización de datos. Las elecciones populares que son robustas son Sereal , JSON :: XS y YAML :: XS . Los formatos menos conocidos son: ASN.1 , Avro , BERT , BSON , CBOR , JSYNC , MessagePack , Protocolo Buffers , Thrift .

Otras opciones mencionadas a menudo son Storable y Data :: Dumper (o similar) / eval , pero no puedo recomendarlas porque el formato de Storable es dependiente de la versión de Perl, y eval no es seguro porque 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 desde aquí es la persistencia del objeto .


Lea también: Serializadores para Perl: cuándo usar qué

Perlmonks tiene dos buenas discusiones sobre la serialización.

  • Cómo guardar y volver a cargar mi hash
  • ¿Cómo puedo visualizar mi compleja estructura de datos?

Esto realmente depende de cómo desee almacenar sus datos en su 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 # is an opens a sample txt file in read-only mode. my %hash; while () { chomp; my ($key, $val) = split /=/; $hash{$key} .= exists $hash{$key} ? ",$val" : $val; } 

Si eres nuevo, simplemente sugiero make a string desde array / hash con join () y lo escriben con “print” y luego leen y usan split () para hacer array / hash nuevamente. Esa sería una manera más simple como el ejemplo de libro de texto de enseñanza de Perl.