私は初心者です。perlでデータを保存して読み取る方法についての基本的な知識が必要です。ハッシュと配列を保存するとします。どの形式(拡張子)のファイルを使用する必要がありますか?TXT?print FILE %hash
これまでのところ、すべてのものを文字列として保存し、文字列として読み戻すことしかできませんprint <FILE>
。ファイルからの関数ハッシュと配列入力が必要な場合はどうすればよいですか。それらをハッシュと配列に戻す方法は?
4 に答える
データのシリアル化を探しています。堅牢な人気のある選択肢は、シリアル、JSON :: XS、YAML::XSです。あまり知られていない形式は、 ASN.1、Avro、BERT、BSON、CBOR、JSYNC、MessagePack、Protocol Buffers、Thriftです。
他のよく言及される選択肢はStorableとData:: Dumper (または同様のもの)/ですが、Storableの形式はPerlのバージョンに依存し、任意のコードを実行するため安全eval
ではないため、お勧めできません。eval
2012年の時点で、カウンターパートのData::Undumpの解析はまだそれほど進んでいません。また、Perlデータ型を適切にマップせず、XMLとデータ間の変換方法に競合する/互換性のないスキーマが複数存在するため、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用シリアライザー:いつ何を使うか
Perlmonksには、シリアル化について2つの良い議論があります。
これは、データをファイルにどのように保存するかによって異なります。ファイルを配列に読み込んだり、ハッシュをファイルに書き戻したりできるように、いくつかの基本的な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が教科書の例を教えるようなもっと簡単な方法でしょう。