Хранить и читать хэш и массив в файлах в 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.