目錄

名稱

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 介面至 zlibzlib-ng 壓縮函式庫(有關取得 zlibzlib-ng 的詳細資訊,請參閱 "另請參閱")。

在以下文字中,除非另有說明,所有對 zlib 的參照也適用於 zlib-ng

Compress::Raw::Zlib::Deflate

此區段定義一個介面,允許使用 zlib 所提供的 deflate 介面進行記憶體內壓縮。

以下是可用的介面定義

($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] )

初始化一個壓縮物件。

如果您熟悉 zlib 函式庫,它結合了 zlib 函式 deflateInitdeflateInit2deflateSetDictionary 的功能。

如果成功,它將傳回已初始化的壓縮物件 $d 和清單內容為 Z_OK$status。在純量內容中,它只會傳回壓縮物件 $d

如果不成功,傳回的壓縮物件 $d 將會是 undef,而 $status 將會包含一個 zlib 錯誤代碼。

此函式可選擇採用指定為 名稱 => 值 成對的命名選項。這允許調整個別選項,而無需在參數清單中指定所有選項。

為了向後相容性,也可以將參數傳遞為包含名稱=>值的雜湊的參考。

以下是有效選項的清單

-Level

定義壓縮層級。有效值為 0 到 9、Z_NO_COMPRESSIONZ_BEST_SPEEDZ_BEST_COMPRESSIONZ_DEFAULT_COMPRESSION

預設值為 Z_DEFAULT_COMPRESSION

-Method

定義壓縮方法。目前唯一有效值(也是預設值)為 Z_DEFLATED

-WindowBits

若要壓縮 RFC 1950 資料串流,請將 WindowBits 設為 8 到 15 之間的正數。

若要壓縮 RFC 1951 資料串流,請將 WindowBits 設為 -MAX_WBITS

若要壓縮 RFC 1952 資料串流(即 gzip),請將 WindowBits 設為 WANT_GZIP

有關 WindowBits 的意義和有效值的定義,請參閱 zlibdeflateInit2 的文件。

預設值為 MAX_WBITS

-MemLevel

有關 MemLevel 的意義和有效值的定義,請參閱 zlibdeflateInit2 的文件。

預設值為 MAX_MEM_LEVEL。

-Strategy

定義用於調整壓縮的策略。有效值為 Z_DEFAULT_STRATEGYZ_FILTEREDZ_RLEZ_FIXEDZ_HUFFMAN_ONLY

預設值為 Z_DEFAULT_STRATEGY

-Dictionary

當指定字典時,Compress::Raw::Zlib 會在呼叫 deflateInit 之後自動直接呼叫 deflateSetDictionary。字典的 Adler32 值可透過呼叫方法 $d->dict_adler() 取得。

預設值為沒有字典。

-Bufsize

設定 $d->deflate$d->flush 方法使用的輸出緩衝區的初始大小。如果必須重新配置緩衝區以增加大小,它將以 Bufsize 的增量成長。

預設緩衝區大小為 4096。

-AppendOutput

此選項控制 $d->deflate$d->flush 方法如何將資料寫入輸出緩衝區。

如果 AppendOutput 選項設為 false,$d->deflate$d->flush 方法中的輸出緩衝區會在未壓縮資料寫入其中之前被截斷。

如果選項設為 true,未壓縮資料會附加到 $d->deflate$d->flush 方法中的輸出緩衝區。

此選項預設為 false。

-CRC32

如果設為 true,將會計算未壓縮資料的 crc32 校驗和。使用 $d->crc32 方法來擷取這個值。

此選項預設為 false。

-ADLER32

如果設為 true,將會計算未壓縮資料的 adler32 校驗和。使用 $d->adler32 方法來擷取這個值。

此選項預設為 false。

以下是一個使用 Compress::Raw::Zlib::Deflate 選擇性參數清單來覆寫預設緩衝區大小和壓縮層級的範例。所有其他選項將採用其預設值。

my $d = new Compress::Raw::Zlib::Deflate ( -Bufsize => 300,
                                           -Level   => Z_BEST_SPEED ) ;

$status = $d->deflate($input, $output)

壓縮 $input 的內容,並將壓縮後的資料寫入 $output

$input$output 參數可以是純量或純量參考。

完成後,$input 將會完全處理完畢(假設沒有錯誤)。如果壓縮成功,它會將壓縮後的資料寫入 $output,並傳回狀態值 Z_OK

發生錯誤時,它會傳回一個 zlib 錯誤代碼。

如果在 $d 物件的建構函式中將 AppendOutput 選項設為 true,壓縮後的資料將會附加到 $output。如果為 false,則在將任何壓縮後的資料寫入 $output 之前,將會先將其截斷。

注意:這個方法並非每次呼叫時都會將壓縮後的資料寫入 $output。因此,如果從這個方法傳回時 $output 的內容為空,請勿假設發生錯誤。只要方法傳回的代碼為 Z_OK,就表示壓縮已成功。

$status = $d->flush($output [, $flush_type])

通常用於完成壓縮。任何待處理的輸出都將寫入 $output

如果成功,傳回 Z_OK

請注意,強制輸出可能會嚴重降低壓縮率,因此它只應在終止解壓縮(使用 Z_FINISH)或當您想要建立一個 完整強制點(使用 Z_FULL_FLUSH)時使用。

預設使用的 flush_typeZ_FINISHflush_type 的其他有效值為 Z_NO_FLUSHZ_PARTIAL_FLUSHZ_SYNC_FLUSHZ_FULL_FLUSH。強烈建議您只有在完全了解其含義的情況下才設定 flush_type 參數。有關詳細資訊,請參閱 zlib 文件。

如果在 $d 物件的建構函式中將 AppendOutput 選項設為 true,壓縮後的資料將會附加到 $output。如果為 false,則在將任何壓縮後的資料寫入 $output 之前,將會先將其截斷。

$status = $d->deflateReset()

這個方法將重設壓縮物件 $d。當您要壓縮多個資料串流,並希望使用同一個物件來壓縮每個串流時,可以使用這個方法。它只應在先前資料串流已成功強制輸出後使用,亦即呼叫 $d->flush(Z_FINISH) 已傳回 Z_OK

如果成功,傳回 Z_OK

$status = $d->deflateParams([OPT])

變更壓縮物件 $d 的設定。

以下列出有效選項清單。未指定的選項將保持不變。

-Level

定義壓縮層級。有效值為 0 到 9、Z_NO_COMPRESSIONZ_BEST_SPEEDZ_BEST_COMPRESSIONZ_DEFAULT_COMPRESSION

-Strategy

定義用於調整壓縮的策略。有效值為 Z_DEFAULT_STRATEGYZ_FILTEREDZ_HUFFMAN_ONLY

-BufSize

設定 $d->deflate$d->flush 方法使用的輸出緩衝區的初始大小。如果必須重新配置緩衝區以增加大小,它將以 Bufsize 的增量成長。

$status = $d->deflateTune($good_length, $max_lazy, $nice_length, $max_chain)

調整 deflate 物件 $d 的內部設定。此選項僅在執行 zlib 1.2.2.3 或更新版本時可用。

請參閱 zlib.h 中的文件,了解如何使用 deflateTune

$d->dict_adler()

傳回字典的 adler32 值。

$d->crc32()

傳回迄今為止未壓縮資料的 crc32 值。

如果此物件的建構函式中未啟用 CRC32 選項,此方法將永遠傳回 0;

$d->adler32()

傳回迄今為止未壓縮資料的 adler32 值。

$d->msg()

傳回 zlib 產生的最後一個錯誤訊息。

$d->total_in()

傳回輸入 deflate 的未壓縮位元組總數。

$d->total_out()

傳回 deflate 輸出的壓縮位元組總數。

$d->get_Strategy()

傳回目前使用的壓縮策略。有效值為 Z_DEFAULT_STRATEGYZ_FILTEREDZ_HUFFMAN_ONLY

$d->get_Level()

傳回正在使用的壓縮等級。

$d->get_BufSize()

傳回用於執行壓縮的緩衝區大小。

範例

以下是一個使用 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 ;

Compress::Raw::Zlib::Inflate

此區段定義一個介面,允許使用 zlib 提供的 inflate 介面進行記憶體中解壓縮。

以下是介面的定義

($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] )

初始化一個膨脹物件。

在清單內容中,它會傳回膨脹物件 $izlib 狀態碼 ($status)。在標量內容中,它只會傳回膨脹物件。

若成功,$i 會包含膨脹物件,而 $status 會是 Z_OK

若不成功,$i 會是 undef,而 $status 會包含 zlib 錯誤碼。

此函式可以選擇採用多個命名選項,指定為 -名稱 => 值 對。這允許個別選項進行調整,而無需在參數清單中指定所有選項。

為了向後相容,也可以將參數傳遞為對包含 名稱=>值 對的雜湊的參考。

以下是有效選項的清單

-WindowBits

若要解壓縮 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

-Bufsize

設定 $i->inflate 方法所使用的輸出緩衝區的初始大小。如果必須重新分配此方法中的輸出緩衝區以增加大小,它將以 Bufsize 的增量成長。

預設值為 4096。

-Dictionary

預設值為沒有字典。

-AppendOutput

此選項控制 $i->inflate 方法如何將資料寫入輸出緩衝區。

如果選項設定為 false,$i->inflate 方法中的輸出緩衝區會在未壓縮資料寫入其中之前被截斷。

如果選項設定為 true,$i->inflate 方法會將未壓縮資料附加到輸出緩衝區。

此選項預設為 false。

-CRC32

如果設定為 true,將會計算未壓縮資料的 crc32 校驗和。使用 $i->crc32 方法來擷取此值。

此選項預設為 false。

-ADLER32

如果設為 true,將計算未壓縮資料的 adler32 檢查和。使用 $i->adler32 方法來擷取此值。

此選項預設為 false。

-ConsumeInput

如果設為 true,此選項將在 inflate 進行時從 $i->inflate 方法的輸入緩衝區中移除壓縮資料。

當您處理嵌入在其他檔案/緩衝區中的壓縮資料時,此選項會很有用。在此情況下,緊接在壓縮串流之後的資料將留在輸入緩衝區中。

此選項預設為 true。

-LimitOutput

LimitOutput 選項會變更 $i->inflate 方法的行為,以便可以限制輸出緩衝區使用的記憶體量。

使用 LimitOutput 時,所使用的輸出緩衝區大小將會是 Bufsize 選項的值或已配置給 $output 的記憶體量,以較大者為準。預測可用的輸出大小很棘手,因此請勿依賴取得精確的輸出緩衝區大小。

如果未指定 LimitOutout$i->inflate 將使用與其解壓縮輸入緩衝區所建立的所有未壓縮資料寫入相同的記憶體量。

如果啟用 LimitOutput,也會啟用 ConsumeInput 選項。

此選項預設為 false。

請參閱 "LimitOutput 選項",以了解為何需要 LimitOutput 以及如何使用它。

以下是一個使用選用參數來覆寫預設緩衝區大小的範例。

my ($i, $status) = new Compress::Raw::Zlib::Inflate( -Bufsize => 300 ) ;

$status = $i->inflate($input, $output [,$eof])

$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. 您使用的是舊於 1.2.0 版本的 zlib 副本,或者您希望應用程式程式碼能夠在盡可能多的不同 zlib 版本中執行。

  2. 您已在這個物件的建構函式中將 WindowBits 參數設定為 -MAX_WBITS,亦即您正在解壓縮原始的壓縮資料串流 (RFC 1951)。

  3. 壓縮資料串流後沒有資料。

如果所有這些都是情況,則您需要在最後一次呼叫 (且僅最後一次呼叫) $i->inflate 時將 $eof 參數設定為 true。

如果您使用 zlib >= 1.2.0 建置這個模組,則會忽略 $eof 參數。您仍然可以設定它,但它不會在幕後使用。

$status = $i->inflateSync($input)

這個方法可用於嘗試從部分損毀的壓縮資料串流中復原良好資料。它會掃描 $input,直到到達完全清除點或緩衝區的末端。

如果找到完全清除點,則傳回 Z_OK,且 $input 會移除清除點之前的所有資料。然後可以將這些資料傳遞給 $i->inflate 方法進行解壓縮。

任何其他傳回碼表示未找到清除點。如果還有更多資料可用,則可以重複呼叫 inflateSync,並提供更多壓縮資料,直到找到清除點。

請注意,完全清除點在壓縮資料串流中預設不存在。當透過呼叫 Compress::Deflate::flush 並使用 Z_FULL_FLUSH 建立資料串流時,必須明確加入這些清除點。

$status = $i->inflateReset()

這個方法會重設膨脹物件 $i。當您解壓縮多個資料串流,且想要使用同一個物件解壓縮每個串流時,可以使用這個方法。

如果成功,傳回 Z_OK

$i->dict_adler()

傳回字典的 adler32 值。

$i->crc32()

傳回迄今為止未壓縮資料的 crc32 值。

如果此物件的建構函式中未啟用 CRC32 選項,此方法將永遠傳回 0;

$i->adler32()

傳回迄今為止未壓縮資料的 adler32 值。

如果建構式中未啟用 ADLER32 選項,此方法將永遠傳回 0;

$i->msg()

傳回 zlib 產生的最後一個錯誤訊息。

$i->total_in()

傳回輸入 inflate 的總壓縮位元組數。

$i->total_out()

傳回從 inflate 輸出的總解壓縮位元組數。

$d->get_BufSize()

傳回用於執行解壓縮的緩衝區大小。

範例

以下是如何使用 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 文件以取得更多詳細資料。

其他

my $version = Compress::Raw::Zlib::zlib_version();

如果已使用 zlib 函式庫建置此模組,則傳回 zlib 函式庫的版本。如果已使用原生模式在 zlib-ng 中建置此模組,此函數將傳回一個空字串。如果已使用相容模式在 zlib-ng 中建置此模組,此函數將傳回 zlib-ng 支援的 Izlib> API 版本。

my $version = Compress::Raw::Zlib::zlibng_version();

如果此模組已使用 zlib-ng 函式庫建置,則傳回 zlib-ng 函式庫的版本。如果此模組已使用 zlib 建置,則此函式將傳回空字串。

my $flags = Compress::Raw::Zlib::zlibCompileFlags();

傳回用於建置 zlib 或 zlib-ng 函式庫的編譯時期選項指示旗標。請參閱 zlib 文件,以取得 zlibCompileFlags 傳回的旗標說明。

請注意,當 zlib 來源與此模組一起建置時,應略過 sprintf 旗標 (位元 24、25 和 26)。

如果您使用的是 zlib 1.2.0 或更舊版本,則 zlibCompileFlags 將傳回 0。

is_zlib_native(); =head2 is_zlibng_native(); =head2 is_zlibng_compat(); =head2 is_zlibng();

這些函式可用於檢查 Compress::Raw::Zlib 是使用 zlibzlib-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。

LimitOutput 選項。

預設情況下,$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 ;

要注意的重點是

對於大多數的使用案例,上述行為是可以接受的(此模組及其前身 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 ;

這次要注意的重點

存取 ZIP 檔案

雖然可以(需要您付出一些努力)使用這個模組存取 .zip 檔案,但還有其他 perl 模組可以幫您完成所有繁瑣的工作。請查看 Archive::ZipArchive::Zip::SimpleZipIO::Compress::ZipIO::Uncompress::Unzip

常見問題

與 Unix compress/uncompress 相容性。

這個模組與 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 ;

存取 .tar.Z 檔案

請參閱前一個常見問題項目。

如果已安裝 Archive::Tar 模組,且 uncompressgunzip 程式可用,您可以使用其中一個解決方案來讀取 .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 ;

Zlib 函式庫版本支援

預設情況下,Compress::Raw::Zlib 會使用 zlib 函式庫版本 1.2.5 的私人副本進行建置。(請參閱 README 檔案,了解如何覆寫此行為)

如果您決定使用不同版本的 zlib 函式庫,您需要了解以下問題

常數

當您使用 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::ZlibIO::Compress::GzipIO::Uncompress::GunzipIO::Compress::DeflateIO::Uncompress::InflateIO::Compress::RawDeflateIO::Uncompress::RawInflateIO::Compress::Bzip2IO::Uncompress::Bunzip2IO::Compress::LzmaIO::Uncompress::UnLzmaIO::Compress::XzIO::Uncompress::UnXzIO::Compress::LzipIO::Uncompress::UnLzipIO::Compress::LzopIO::Uncompress::UnLzopIO::Compress::LzfIO::Uncompress::UnLzfIO::Compress::ZstdIO::Uncompress::UnZstdIO::Uncompress::AnyInflateIO::Uncompress::AnyUncompress

IO::Compress::FAQ

File::GlobMapperArchive::ZipArchive::TarIO::Zlib

有關 RFC 1950、1951 和 1952,請參閱 https://datatracker.ietf.org/doc/html/rfc1950https://datatracker.ietf.org/doc/html/rfc1951https://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 相同的條款下重新散布或修改它。