1

Perl v5.22.1、2.53_01 Storable、およびIO::Uncompress::Gunzip2.068 を使用しています。

Storable中間ファイルを使用せずに、Perl を使用してメモリ内のファイルを gunzip したいと考えています。

$zip_file = '/some/storable.gz'この圧縮ファイルを指す変数があります。

ファイルに直接 gunzip すると、これは正常に機能し、正しくハッシュ%rootに設定されます。Storable

gunzip($zip_file, '/home/myusername/Programming/unzipped');
my %root = %{retrieve('/home/myusername/Programming/unzipped')};

ただし、次のようにメモリにガンジップすると:

my $file;
gunzip($zip_file, \$file);
my %root = %{thaw($file)};

エラーが発生します

Storable binary image v56.115 more recent than I am (v2.10)`

そのため、Storable のマジック ナンバーは解体されました。それほど高くなることはありません。

ただし、解凍されたバッファ内の文字列は依然として正しいです。pstバッファは正しいStorableヘッダーで始まります。壊れているのは整数のようなマルチバイト変数だけのようです。

これは、ファイル バッファへの書き込みが別の方法で機能している間に、ファイルへの書き込みが 1 つの方法で機能するように、バイト順と関係がありますか? 整数を台無しにすることなく、バッファにガンジップするにはどうすればよいですか?

4

1 に答える 1

4

それは unzip とは関係ありませんが、retrievevs.の使用とは関係ありませんthaw。どちらも異なる入力を期待しています。つまりthaw、 からの出力を期待しているのfreezeに対し、 からretrieveの出力を期待していますstore。これは、簡単なテストで確認できます。

$ perl -MStorable -e 'my $x = {}; store($x,q[file.store])'
$ perl -MStorable=freeze -e 'my $x = {}; print freeze($x)' > file.freeze

私のマシンでは、これにより、によって作成されたファイルに24バイトstorefreeze. file.storeファイルから先頭の 4 バイトを削除するとfile.freeze、ストアは 4 バイトのヘッダーを追加したことになります。thawしたがって、メモリ内のファイルを解凍し、先頭の 4 バイトを削除して、残りで実行しようとする場合があります。

于 2016-08-12T08:02:16.733 に答える