Compress::Raw::Zlib - zlib 或 zlib-ng 壓縮函式庫的低階介面
use Compress::Raw::Zlib ;
($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) ;
$status = $d->deflate($input, $output) ;
$status = $d->flush($output [, $flush_type]) ;
$d->deflateReset() ;
$d->deflateParams(OPTS) ;
$d->deflateTune(OPTS) ;
$d->dict_adler() ;
$d->crc32() ;
$d->adler32() ;
$d->total_in() ;
$d->total_out() ;
$d->msg() ;
$d->get_Strategy();
$d->get_Level();
$d->get_BufSize();
($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) ;
$status = $i->inflate($input, $output [, $eof]) ;
$status = $i->inflateSync($input) ;
$i->inflateReset() ;
$i->dict_adler() ;
$d->crc32() ;
$d->adler32() ;
$i->total_in() ;
$i->total_out() ;
$i->msg() ;
$d->get_BufSize();
$crc = adler32($buffer [,$crc]) ;
$crc = crc32($buffer [,$crc]) ;
$crc = crc32_combine($crc1, $crc2, $len2);
$adler = adler32_combine($adler1, $adler2, $len2);
my $version = Compress::Raw::Zlib::zlib_version();
my $flags = Compress::Raw::Zlib::zlibCompileFlags();
is_zlib_native();
is_zlibng_native();
is_zlibng_compat();
is_zlibng();
Compress::Raw::Zlib 模組提供 Perl 介面至 zlib 或 zlib-ng 壓縮函式庫(有關取得 zlib 或 zlib-ng 的詳細資訊,請參閱 "另請參閱")。
在以下文字中,除非另有說明,所有對 zlib 的參照也適用於 zlib-ng。
此區段定義一個介面,允許使用 zlib 所提供的 deflate 介面進行記憶體內壓縮。
以下是可用的介面定義
初始化一個壓縮物件。
如果您熟悉 zlib 函式庫,它結合了 zlib 函式 deflateInit
、deflateInit2
和 deflateSetDictionary
的功能。
如果成功,它將傳回已初始化的壓縮物件 $d
和清單內容為 Z_OK
的 $status
。在純量內容中,它只會傳回壓縮物件 $d
。
如果不成功,傳回的壓縮物件 $d
將會是 undef,而 $status
將會包含一個 zlib 錯誤代碼。
此函式可選擇採用指定為 名稱 => 值
成對的命名選項。這允許調整個別選項,而無需在參數清單中指定所有選項。
為了向後相容性,也可以將參數傳遞為包含名稱=>值的雜湊的參考。
以下是有效選項的清單
定義壓縮層級。有效值為 0 到 9、Z_NO_COMPRESSION
、Z_BEST_SPEED
、Z_BEST_COMPRESSION
和 Z_DEFAULT_COMPRESSION
。
預設值為 Z_DEFAULT_COMPRESSION
。
定義壓縮方法。目前唯一有效值(也是預設值)為 Z_DEFLATED
。
若要壓縮 RFC 1950 資料串流,請將 WindowBits
設為 8 到 15 之間的正數。
若要壓縮 RFC 1951 資料串流,請將 WindowBits
設為 -MAX_WBITS
。
若要壓縮 RFC 1952 資料串流(即 gzip),請將 WindowBits
設為 WANT_GZIP
。
有關 WindowBits
的意義和有效值的定義,請參閱 zlib 中 deflateInit2 的文件。
預設值為 MAX_WBITS
。
有關 MemLevel
的意義和有效值的定義,請參閱 zlib 中 deflateInit2 的文件。
預設值為 MAX_MEM_LEVEL。
定義用於調整壓縮的策略。有效值為 Z_DEFAULT_STRATEGY
、Z_FILTERED
、Z_RLE
、Z_FIXED
和 Z_HUFFMAN_ONLY
。
預設值為 Z_DEFAULT_STRATEGY
。
當指定字典時,Compress::Raw::Zlib 會在呼叫 deflateInit
之後自動直接呼叫 deflateSetDictionary
。字典的 Adler32 值可透過呼叫方法 $d->dict_adler()
取得。
預設值為沒有字典。
設定 $d->deflate
和 $d->flush
方法使用的輸出緩衝區的初始大小。如果必須重新配置緩衝區以增加大小,它將以 Bufsize
的增量成長。
預設緩衝區大小為 4096。
此選項控制 $d->deflate
和 $d->flush
方法如何將資料寫入輸出緩衝區。
如果 AppendOutput
選項設為 false,$d->deflate
和 $d->flush
方法中的輸出緩衝區會在未壓縮資料寫入其中之前被截斷。
如果選項設為 true,未壓縮資料會附加到 $d->deflate
和 $d->flush
方法中的輸出緩衝區。
此選項預設為 false。
如果設為 true,將會計算未壓縮資料的 crc32 校驗和。使用 $d->crc32
方法來擷取這個值。
此選項預設為 false。
如果設為 true,將會計算未壓縮資料的 adler32 校驗和。使用 $d->adler32
方法來擷取這個值。
此選項預設為 false。
以下是一個使用 Compress::Raw::Zlib::Deflate
選擇性參數清單來覆寫預設緩衝區大小和壓縮層級的範例。所有其他選項將採用其預設值。
my $d = new Compress::Raw::Zlib::Deflate ( -Bufsize => 300,
-Level => Z_BEST_SPEED ) ;
壓縮 $input
的內容,並將壓縮後的資料寫入 $output
。
$input
和 $output
參數可以是純量或純量參考。
完成後,$input
將會完全處理完畢(假設沒有錯誤)。如果壓縮成功,它會將壓縮後的資料寫入 $output
,並傳回狀態值 Z_OK
。
發生錯誤時,它會傳回一個 zlib 錯誤代碼。
如果在 $d
物件的建構函式中將 AppendOutput
選項設為 true,壓縮後的資料將會附加到 $output
。如果為 false,則在將任何壓縮後的資料寫入 $output
之前,將會先將其截斷。
注意:這個方法並非每次呼叫時都會將壓縮後的資料寫入 $output
。因此,如果從這個方法傳回時 $output
的內容為空,請勿假設發生錯誤。只要方法傳回的代碼為 Z_OK
,就表示壓縮已成功。
通常用於完成壓縮。任何待處理的輸出都將寫入 $output
。
如果成功,傳回 Z_OK
。
請注意,強制輸出可能會嚴重降低壓縮率,因此它只應在終止解壓縮(使用 Z_FINISH
)或當您想要建立一個 完整強制點(使用 Z_FULL_FLUSH
)時使用。
預設使用的 flush_type
為 Z_FINISH
。flush_type
的其他有效值為 Z_NO_FLUSH
、Z_PARTIAL_FLUSH
、Z_SYNC_FLUSH
和 Z_FULL_FLUSH
。強烈建議您只有在完全了解其含義的情況下才設定 flush_type
參數。有關詳細資訊,請參閱 zlib
文件。
如果在 $d
物件的建構函式中將 AppendOutput
選項設為 true,壓縮後的資料將會附加到 $output
。如果為 false,則在將任何壓縮後的資料寫入 $output
之前,將會先將其截斷。
這個方法將重設壓縮物件 $d
。當您要壓縮多個資料串流,並希望使用同一個物件來壓縮每個串流時,可以使用這個方法。它只應在先前資料串流已成功強制輸出後使用,亦即呼叫 $d->flush(Z_FINISH)
已傳回 Z_OK
。
如果成功,傳回 Z_OK
。
變更壓縮物件 $d
的設定。
以下列出有效選項清單。未指定的選項將保持不變。
定義壓縮層級。有效值為 0 到 9、Z_NO_COMPRESSION
、Z_BEST_SPEED
、Z_BEST_COMPRESSION
和 Z_DEFAULT_COMPRESSION
。
定義用於調整壓縮的策略。有效值為 Z_DEFAULT_STRATEGY
、Z_FILTERED
和 Z_HUFFMAN_ONLY
。
設定 $d->deflate
和 $d->flush
方法使用的輸出緩衝區的初始大小。如果必須重新配置緩衝區以增加大小,它將以 Bufsize
的增量成長。
調整 deflate 物件 $d
的內部設定。此選項僅在執行 zlib 1.2.2.3 或更新版本時可用。
請參閱 zlib.h 中的文件,了解如何使用 deflateTune
。
傳回字典的 adler32 值。
傳回迄今為止未壓縮資料的 crc32 值。
如果此物件的建構函式中未啟用 CRC32
選項,此方法將永遠傳回 0;
傳回迄今為止未壓縮資料的 adler32 值。
傳回 zlib 產生的最後一個錯誤訊息。
傳回輸入 deflate 的未壓縮位元組總數。
傳回 deflate 輸出的壓縮位元組總數。
傳回目前使用的壓縮策略。有效值為 Z_DEFAULT_STRATEGY
、Z_FILTERED
和 Z_HUFFMAN_ONLY
。
傳回正在使用的壓縮等級。
傳回用於執行壓縮的緩衝區大小。
以下是一個使用 deflate
的簡單範例。它只讀取標準輸入,對其進行壓縮,並將其寫入標準輸出。
use strict ;
use warnings ;
use Compress::Raw::Zlib ;
binmode STDIN;
binmode STDOUT;
my $x = new Compress::Raw::Zlib::Deflate
or die "Cannot create a deflation stream\n" ;
my ($output, $status) ;
while (<>)
{
$status = $x->deflate($_, $output) ;
$status == Z_OK
or die "deflation failed\n" ;
print $output ;
}
$status = $x->flush($output) ;
$status == Z_OK
or die "deflation failed\n" ;
print $output ;
此區段定義一個介面,允許使用 zlib 提供的 inflate 介面進行記憶體中解壓縮。
以下是介面的定義
初始化一個膨脹物件。
在清單內容中,它會傳回膨脹物件 $i
和 zlib 狀態碼 ($status
)。在標量內容中,它只會傳回膨脹物件。
若成功,$i
會包含膨脹物件,而 $status
會是 Z_OK
。
若不成功,$i
會是 undef,而 $status
會包含 zlib 錯誤碼。
此函式可以選擇採用多個命名選項,指定為 -名稱 => 值
對。這允許個別選項進行調整,而無需在參數清單中指定所有選項。
為了向後相容,也可以將參數傳遞為對包含 名稱=>值
對的雜湊的參考。
以下是有效選項的清單
若要解壓縮 RFC 1950 資料串流,請將 WindowBits
設定為 8 至 15 之間的正數。
若要解壓縮 RFC 1951 資料串流,請將 WindowBits
設定為 -MAX_WBITS
。
若要解壓縮 RFC 1952 資料串流 (即 gzip),請將 WindowBits
設定為 WANT_GZIP
。
若要自動偵測並解壓縮 RFC 1950 或 RFC 1952 資料串流 (即 gzip),請將 WindowBits
設定為 WANT_GZIP_OR_ZLIB
。
若要完整定義 WindowBits
的意義和有效值,請參閱 zlib 文件中的 inflateInit2。
預設值為 MAX_WBITS
。
設定 $i->inflate
方法所使用的輸出緩衝區的初始大小。如果必須重新分配此方法中的輸出緩衝區以增加大小,它將以 Bufsize
的增量成長。
預設值為 4096。
預設值為沒有字典。
此選項控制 $i->inflate
方法如何將資料寫入輸出緩衝區。
如果選項設定為 false,$i->inflate
方法中的輸出緩衝區會在未壓縮資料寫入其中之前被截斷。
如果選項設定為 true,$i->inflate
方法會將未壓縮資料附加到輸出緩衝區。
此選項預設為 false。
如果設定為 true,將會計算未壓縮資料的 crc32 校驗和。使用 $i->crc32
方法來擷取此值。
此選項預設為 false。
如果設為 true,將計算未壓縮資料的 adler32 檢查和。使用 $i->adler32
方法來擷取此值。
此選項預設為 false。
如果設為 true,此選項將在 inflate 進行時從 $i->inflate
方法的輸入緩衝區中移除壓縮資料。
當您處理嵌入在其他檔案/緩衝區中的壓縮資料時,此選項會很有用。在此情況下,緊接在壓縮串流之後的資料將留在輸入緩衝區中。
此選項預設為 true。
LimitOutput
選項會變更 $i->inflate
方法的行為,以便可以限制輸出緩衝區使用的記憶體量。
使用 LimitOutput
時,所使用的輸出緩衝區大小將會是 Bufsize
選項的值或已配置給 $output
的記憶體量,以較大者為準。預測可用的輸出大小很棘手,因此請勿依賴取得精確的輸出緩衝區大小。
如果未指定 LimitOutout
,$i->inflate
將使用與其解壓縮輸入緩衝區所建立的所有未壓縮資料寫入相同的記憶體量。
如果啟用 LimitOutput
,也會啟用 ConsumeInput
選項。
此選項預設為 false。
請參閱 "LimitOutput 選項",以了解為何需要 LimitOutput
以及如何使用它。
以下是一個使用選用參數來覆寫預設緩衝區大小的範例。
my ($i, $status) = new Compress::Raw::Zlib::Inflate( -Bufsize => 300 ) ;
將 $input
的完整內容膨脹,並將未壓縮的資料寫入 $output
。$input
和 $output
參數可以是純量或純量參考。
如果成功,會傳回 Z_OK
;如果已成功到達壓縮資料的尾端,會傳回 Z_STREAM_END
。
如果未成功,$status
將會保留 zlib 錯誤碼。
如果在建立 Compress::Raw::Zlib::Inflate
物件時已將 ConsumeInput
選項設為 true,inflate
會修改 $input
參數。完成後,它將包含膨脹後輸入緩衝區的剩餘部分。實際上,這表示當傳回狀態為 Z_OK
時,$input
參數將包含一個空字串;而當傳回狀態為 Z_STREAM_END
時,$input
參數將包含在膨脹資料串流後儲存在輸入緩衝區中的內容(如果有)。
當處理封裝壓縮資料串流(例如 gzip、zip)的檔案格式,而且在膨脹串流後有立即有用的資料時,此功能會很有用。
如果在此物件的建構函式中將 AppendOutput
選項設為 true,未壓縮的資料將會附加到 $output
。如果為 false,$output
將會在寫入任何未壓縮的資料之前被截斷。
$eof
參數需要一點說明。
在 1.2.0 版本之前,zlib 在進行解壓縮時假設壓縮資料串流後至少有一個尾隨位元組。這通常不是問題,因為大多數 zlib 應用程式保證壓縮資料串流後會有資料。例如,gzip (RFC 1950) 和 zip 都定義了壓縮資料串流後的尾隨資料。
只有在所有下列條件都適用時才需要使用 $eof
參數
您使用的是舊於 1.2.0 版本的 zlib 副本,或者您希望應用程式程式碼能夠在盡可能多的不同 zlib 版本中執行。
您已在這個物件的建構函式中將 WindowBits
參數設定為 -MAX_WBITS
,亦即您正在解壓縮原始的壓縮資料串流 (RFC 1951)。
壓縮資料串流後沒有資料。
如果所有這些都是情況,則您需要在最後一次呼叫 (且僅最後一次呼叫) $i->inflate
時將 $eof
參數設定為 true。
如果您使用 zlib >= 1.2.0 建置這個模組,則會忽略 $eof
參數。您仍然可以設定它,但它不會在幕後使用。
這個方法可用於嘗試從部分損毀的壓縮資料串流中復原良好資料。它會掃描 $input
,直到到達完全清除點或緩衝區的末端。
如果找到完全清除點,則傳回 Z_OK
,且 $input
會移除清除點之前的所有資料。然後可以將這些資料傳遞給 $i->inflate
方法進行解壓縮。
任何其他傳回碼表示未找到清除點。如果還有更多資料可用,則可以重複呼叫 inflateSync
,並提供更多壓縮資料,直到找到清除點。
請注意,完全清除點在壓縮資料串流中預設不存在。當透過呼叫 Compress::Deflate::flush
並使用 Z_FULL_FLUSH
建立資料串流時,必須明確加入這些清除點。
這個方法會重設膨脹物件 $i
。當您解壓縮多個資料串流,且想要使用同一個物件解壓縮每個串流時,可以使用這個方法。
如果成功,傳回 Z_OK
。
傳回字典的 adler32 值。
傳回迄今為止未壓縮資料的 crc32 值。
如果此物件的建構函式中未啟用 CRC32
選項,此方法將永遠傳回 0;
傳回迄今為止未壓縮資料的 adler32 值。
如果建構式中未啟用 ADLER32
選項,此方法將永遠傳回 0;
傳回 zlib 產生的最後一個錯誤訊息。
傳回輸入 inflate 的總壓縮位元組數。
傳回從 inflate 輸出的總解壓縮位元組數。
傳回用於執行解壓縮的緩衝區大小。
以下是如何使用 inflate
的範例。
use strict ;
use warnings ;
use Compress::Raw::Zlib;
my $x = new Compress::Raw::Zlib::Inflate()
or die "Cannot create a inflation stream\n" ;
my $input = '' ;
binmode STDIN;
binmode STDOUT;
my ($output, $status) ;
while (read(STDIN, $input, 4096))
{
$status = $x->inflate($input, $output) ;
print $output ;
last if $status != Z_OK ;
}
die "inflation failed\n"
unless $status == Z_STREAM_END ;
下一個範例顯示如何使用 LimitOutput
選項。請注意,在此情況下使用兩個巢狀迴圈。外層迴圈從輸入來源 (STDIN) 讀取資料,而內層迴圈重複呼叫 inflate
,直到 $input
耗盡、出現錯誤或到達串流的結尾。值得注意的一點是,透過使用 LimitOutput
選項,您也會設定 ConsumeInput
,這讓以下程式碼更為簡潔。
use strict ;
use warnings ;
use Compress::Raw::Zlib;
my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
or die "Cannot create a inflation stream\n" ;
my $input = '' ;
binmode STDIN;
binmode STDOUT;
my ($output, $status) ;
OUTER:
while (read(STDIN, $input, 4096))
{
do
{
$status = $x->inflate($input, $output) ;
print $output ;
last OUTER
unless $status == Z_OK || $status == Z_BUF_ERROR ;
}
while ($status == Z_OK && length $input);
}
die "inflation failed\n"
unless $status == Z_STREAM_END ;
zlib 提供兩個函數來計算檢查碼。對於 Perl 介面,兩個函數中兩個參數的順序已反轉。這允許執行執行中檢查碼和一次性計算。
$crc = adler32($buffer [,$crc]) ;
$crc = crc32($buffer [,$crc]) ;
緩衝區參數可以是純量或純量參考。
如果 $crc 參數是 undef
,檢查碼值將重設。
如果您使用 zlib 1.2.3 或更新版本建置此模組,則可以使用另外兩個與 CRC 相關的函數。
$crc = crc32_combine($crc1, $crc2, $len2);
$adler = adler32_combine($adler1, $adler2, $len2);
這些函數允許合併檢查碼。請參閱 zlib 文件以取得更多詳細資料。
如果已使用 zlib 函式庫建置此模組,則傳回 zlib 函式庫的版本。如果已使用原生模式在 zlib-ng 中建置此模組,此函數將傳回一個空字串。如果已使用相容模式在 zlib-ng 中建置此模組,此函數將傳回 zlib-ng 支援的 Izlib> API 版本。
如果此模組已使用 zlib-ng 函式庫建置,則傳回 zlib-ng 函式庫的版本。如果此模組已使用 zlib 建置,則此函式將傳回空字串。
傳回用於建置 zlib 或 zlib-ng 函式庫的編譯時期選項指示旗標。請參閱 zlib 文件,以取得 zlibCompileFlags
傳回的旗標說明。
請注意,當 zlib 來源與此模組一起建置時,應略過 sprintf
旗標 (位元 24、25 和 26)。
如果您使用的是 zlib 1.2.0 或更舊版本,則 zlibCompileFlags
將傳回 0。
這些函式可用於檢查 Compress::Raw::Zlib
是使用 zlib 或 zlib-ng 建置的。
如果 Compress::Raw::Zlib
是使用 zlib 建置的,則函式 is_zlib_native
傳回 true。如果 Compress::Raw::Zlib
是使用 zlib-ng 建置的,則函式 is_zlibng
傳回 true。
zlib-ng 函式庫有一個選項,可使用相容於 zlib 的 API 建置。如果 zlib-ng 已使用此 API 建置,則 c<is_zlibng_compat> 函式傳回 true。
最後,如果 zlib-ng 是使用其原生 API 建置的,則 is_zlibng_native
傳回 true。
預設情況下,$i->inflate($input, $output)
將解壓縮 $input
中的所有資料,並將其產生的所有解壓縮資料寫入 $output
。這使得 inflate
的介面更為簡單 - 如果方法已成功解壓縮 $input
,則 $input
中的所有壓縮資料都將獲得處理。因此,如果您正在從輸入來源讀取資料並在進行中解壓縮,則程式碼看起來會像這樣
use strict ;
use warnings ;
use Compress::Raw::Zlib;
my $x = new Compress::Raw::Zlib::Inflate()
or die "Cannot create a inflation stream\n" ;
my $input = '' ;
my ($output, $status) ;
while (read(STDIN, $input, 4096))
{
$status = $x->inflate($input, $output) ;
print $output ;
last if $status != Z_OK ;
}
die "inflation failed\n"
unless $status == Z_STREAM_END ;
要注意的重點是
程式碼中的主要處理迴圈處理從 STDIN 讀取壓縮資料。
從 inflate
傳回的狀態碼只會在狀態碼不為 Z_OK
時觸發終止主要處理迴圈。當未曾使用 LimitOutput
時,Z_OK
狀態表示已到達壓縮資料串流的結尾,或解壓縮時發生錯誤。
呼叫 inflate
之後,$input
中所有未壓縮的資料都會經過處理。這表示後續呼叫 read
可以覆寫其內容,而不會有任何問題。
對於大多數的使用案例,上述行為是可以接受的(此模組及其前身 Compress::Zlib
已使用它超過 10 年,而沒有問題),但在少數非常特定的使用案例中,$output
所需的記憶體量可能會大到令人望而生畏。例如,如果壓縮資料串流包含重複數千次的相同模式,相對較小的壓縮資料串流可以解壓縮成數百 MB。請記住,inflate
會持續配置記憶體,直到所有未壓縮的資料都寫入輸出緩衝區為止,而 $output
的大小沒有限制。
LimitOutput
選項旨在協助處理此使用案例。
使用 LimitOutput
時,程式碼的主要差異在於必須處理 $input
參數仍包含 inflate
尚未處理的未壓縮資料的情況。如果發生解壓縮,inflate
傳回的狀態碼會是 Z_OK
,如果輸出緩衝區已滿,則會是 Z_BUF_ERROR
。
以下是顯示如何使用 LimitOutput
的典型程式碼。
use strict ;
use warnings ;
use Compress::Raw::Zlib;
my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
or die "Cannot create a inflation stream\n" ;
my $input = '' ;
binmode STDIN;
binmode STDOUT;
my ($output, $status) ;
OUTER:
while (read(STDIN, $input, 4096))
{
do
{
$status = $x->inflate($input, $output) ;
print $output ;
last OUTER
unless $status == Z_OK || $status == Z_BUF_ERROR ;
}
while ($status == Z_OK && length $input);
}
die "inflation failed\n"
unless $status == Z_STREAM_END ;
這次要注意的重點
程式碼中現在有兩個巢狀迴圈:外層迴圈用於從 STDIN 讀取壓縮資料,如同先前;內層迴圈用於執行解壓縮。
內部解壓縮迴圈有兩個離開點。
首先,當 inflate
傳回的狀態不是 Z_OK
或 Z_BUF_ERROR
時。這表示已到達壓縮資料串流的結尾(Z_STREAM_END
),或壓縮資料中有錯誤。在任何一種情況下,繼續讀取壓縮資料都沒有意義,因此兩個迴圈都會終止。
第二個退出點測試輸入緩衝區中是否還有任何資料,$input
- 記住,當使用 LimitOutput
時,ConsumeInput
選項會自動啟用。當輸入緩衝區用盡時,外層迴圈可以再次執行並覆寫現在已經清空的 $input
。
雖然可以(需要您付出一些努力)使用這個模組存取 .zip 檔案,但還有其他 perl 模組可以幫您完成所有繁瑣的工作。請查看 Archive::Zip
、Archive::Zip::SimpleZip
、IO::Compress::Zip
和 IO::Uncompress::Unzip
。
這個模組與 Unix compress
不相容。
如果您有 uncompress
程式,可以使用它來讀取壓縮檔
open F, "uncompress -c $filename |";
while (<F>)
{
...
或者,如果您有 gunzip
程式,可以使用它來讀取壓縮檔
open F, "gunzip -c $filename |";
while (<F>)
{
...
如果您有 compress
程式,可以使用它來寫入壓縮檔
open F, "| compress -c $filename ";
print F "data";
...
close F ;
請參閱前一個常見問題項目。
如果已安裝 Archive::Tar
模組,且 uncompress
或 gunzip
程式可用,您可以使用其中一個解決方案來讀取 .tar.Z
檔案。
首先使用 uncompress
use strict;
use warnings;
use Archive::Tar;
open F, "uncompress -c $filename |";
my $tar = Archive::Tar->new(*F);
...
接著使用 gunzip
use strict;
use warnings;
use Archive::Tar;
open F, "gunzip -c $filename |";
my $tar = Archive::Tar->new(*F);
...
同樣地,如果 compress
程式可用,您可以使用它來寫入 .tar.Z
檔案
use strict;
use warnings;
use Archive::Tar;
use IO::File;
my $fh = new IO::File "| compress -c >$filename";
my $tar = Archive::Tar->new();
...
$tar->write($fh);
$fh->close ;
預設情況下,Compress::Raw::Zlib
會使用 zlib 函式庫版本 1.2.5 的私人副本進行建置。(請參閱 README 檔案,了解如何覆寫此行為)
如果您決定使用不同版本的 zlib 函式庫,您需要了解以下問題
首先,您必須擁有 zlib 1.0.5 或更新版本。
如果您想在 IO::Compress::Gzip
、IO::Compress::Deflate
和 IO::Compress::RawDeflate
中使用 -Merge
選項,則需要擁有 zlib 1.2.1 或更新版本。
當您使用 Compress::Raw::Zlib 時,所有 zlib 常數會自動匯入。
一般的回饋/問題/錯誤報告應傳送至 https://github.com/pmqs/Compress-Raw-Zlib/issues(優先)或 https://rt.cpan.org/Public/Dist/Display.html?Name=Compress-Raw-Zlib。
Compress::Zlib、IO::Compress::Gzip、IO::Uncompress::Gunzip、IO::Compress::Deflate、IO::Uncompress::Inflate、IO::Compress::RawDeflate、IO::Uncompress::RawInflate、IO::Compress::Bzip2、IO::Uncompress::Bunzip2、IO::Compress::Lzma、IO::Uncompress::UnLzma、IO::Compress::Xz、IO::Uncompress::UnXz、IO::Compress::Lzip、IO::Uncompress::UnLzip、IO::Compress::Lzop、IO::Uncompress::UnLzop、IO::Compress::Lzf、IO::Uncompress::UnLzf、IO::Compress::Zstd、IO::Uncompress::UnZstd、IO::Uncompress::AnyInflate、IO::Uncompress::AnyUncompress
File::GlobMapper、Archive::Zip、Archive::Tar、IO::Zlib
有關 RFC 1950、1951 和 1952,請參閱 https://datatracker.ietf.org/doc/html/rfc1950、https://datatracker.ietf.org/doc/html/rfc1951 和 https://datatracker.ietf.org/doc/html/rfc1952
zlib 壓縮函式庫由 Jean-loup Gailly gzip@prep.ai.mit.edu
和 Mark Adler madler@alumni.caltech.edu
編寫。
zlib 壓縮函式庫的主要網站為 http://www.zlib.org。
zlib-ng 壓縮函式庫的主要網站為 https://github.com/zlib-ng/zlib-ng。
gzip 的主要網站為 http://www.gzip.org。
此模組由 Paul Marquess pmqs@cpan.org
編寫。
請參閱 Changes 檔案。
版權所有 (c) 2005-2023 Paul Marquess。保留所有權利。
此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。