2016-05-02 78 views
1

我試圖找到在Perl中解壓縮.Z文件的最佳方法。使用IO::Uncompress:GunzipArchive::Extract都顯示相同的行爲。因爲這兩個報告都沒有失敗,並且它們會生成一個輸出文件 - 儘管它們生成的輸出文件仍然是一個壓縮文件(可以使用Unix gzip -d <filename>解壓縮)。在Perl中解壓縮.Z文件

use IO::Uncompress::Gunzip qw(gunzip $GunzipError); 
my $status = gunzip 'file.16.Z' => 'file.16' or die "failed: $GunzipError"; 

use Archive::Extract; 
my $ae = Archive::Extract->new(archive => 'file.16.Z'); 
$ae->extract(to => 'file.16') or die $ae->error; 

什麼是解壓在Perl中.Z文件的最佳方式是什麼?它只是進行系統調用並使用gzip

+0

是否有可能原始文件被壓縮了兩次,一次是'gzip',一次是'compress'?什麼'file file.16.Z'說? –

回答

2

A .Z文件應該使用過時的compress實用程序創建,而不是gzip。 (compress早於gzip將近十年。)

如果在Perl中有解壓縮這些方法的方法,我不知道它。使用uncompress命令。

+1

'gunzip'(或'gzip -d')也可以解壓縮由'compress'(即.'.Z'文件)創建的文件。 –

2

.Z文件沒有被壓縮。他們是用compress編碼的Lempel-Ziv。它仍然比較流行,文件格式內部(像GIF)和數據存儲方案。您的標準庫與它一起工作是zlib應該響鈴。我有點困惑,並認爲IO::Uncompress::Inflate應該工作,但它不是正確的格式。

你也被揭去與gunzip,因爲作爲男人頁說,最近的gzip版本是:

也能夠解壓縮文件的使用壓縮 壓縮(1)或bzip2的(1) 。

但是,這並不意味着IO::Uncompress::Gunzip模塊將工作。 你的代碼大部分是正確的,否則。

我想這會是一個簡單的任務,採取正常的短文本文件,用compress text.txt壓縮,越來越text.txt.Z然後用作爲記錄的AnyUncompress的Perl模塊,或AnyInflate modlue。但我實際上得到了你描述的相同的行爲,所以它會顯示格式不被支持。

perl -MIO::Uncompress::AnyUncompress=anyuncompress,\$AnyUncompressError -e\ 
'my $z = new IO::Uncompress::AnyUncompress "text.txt.Z" '\ 
'or die "failed $AnyUncompressError";while(<$z>){print};' 
+0

壓縮不是[deflate](https://en.wikipedia.org/wiki/DEFLATE),它是[LZW](https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2 %80%93Welch)。參見[wikipedia for compress](https://en.wikipedia.org/wiki/Compress)。這意味着IO :: Uncompress :: Inflate不能用於解壓縮.Z文件。 –

+0

@SteffenUllrich謝謝;我真的認爲它是這樣,但它們似乎都是以不同的方式使用LZ77。 – dlamblin