Хранить и читать хэш и массив в файлах в Perl

я нуб.Мне нужны некоторые базовые знания о том, как данные должны быть сохранены и в языке Perl. Скажем, сохранить хэш и массив. Какой формат (расширение) файла следует использовать? txt? Пока я могу сохранить все вещи только как stringprint FILE %hash и прочитайте их обратно как stringprint <FILE>. Что делать, если мне нужны хэш-функции и входные данные массива из файла. Как вернуть их в hash и array?

4 ответов


вы ищете сведения сериализации. Популярные варианты, которые являются надежными являются Sereal, в формате JSON:: XS и YAML:: XS. Менее известные форматы: ASN.1, Авро, Берт, BSON, CBOR, JSYNC, MessagePack, Протокол Буферы, бережливость.

другие часто упоминаемые выбор Storable и Data:: Dumper (или аналогичный)/eval, но я не могу рекомендовать их, потому что формат Storable зависит от версии Perl и eval - это небезопасно, потому что он выполняет произвольный код. По состоянию на 2012 год, Счетчик разбора Data:: Undump еще не продвинулся очень далеко. Я также не могу рекомендовать использовать XML, потому что он не отображает типы данных Perl хорошо, и существует несколько конкурирующих / несовместимых схем, как перевести между 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 };
}

следующий шаг отсюда объект настойчивость.


Читайте также: сериализаторы для Perl: когда использовать what



это действительно зависит от того, как вы хотите сохранить свои данные в файле. Я попытаюсь написать базовый код perl, чтобы вы могли прочитать файл в массив и или записать хэш в файл.

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

Если вы новый, я просто предлагаю сделать строку из массива / хэша с join (), и они пишут ее с "print", а затем читают и используют split (), чтобы снова сделать массив/хэш. Это был бы более простой способ, как пример учебника Perl.