内容

名称

IO::Compress::Gzip - 编写 RFC 1952 文件/缓冲区

概要

use IO::Compress::Gzip qw(gzip $GzipError) ;

my $status = gzip $input => $output [,OPTS]
    or die "gzip failed: $GzipError\n";

my $z = IO::Compress::Gzip->new( $output [,OPTS] )
    or die "gzip failed: $GzipError\n";

$z->print($string);
$z->printf($format, $string);
$z->write($string);
$z->syswrite($string [, $length, $offset]);
$z->flush();
$z->tell();
$z->eof();
$z->seek($position, $whence);
$z->binmode();
$z->fileno();
$z->opened();
$z->autoflush();
$z->input_line_number();
$z->newStream( [OPTS] );

$z->deflateParams();

$z->close() ;

$GzipError ;

# IO::File mode

print $z $string;
printf $z $format, $string;
tell $z
eof $z
seek $z, $position, $whence
binmode $z
fileno $z
close $z ;

描述

本模块提供了一个 Perl 接口,允许将压缩数据写入文件或缓冲区,如 RFC 1952 中所定义。

使用本模块可以创建 RFC 1952 中定义的所有 gzip 标头。

有关读取 RFC 1952 文件/缓冲区的信息,请参阅配套模块 IO::Uncompress::Gunzip

函数式接口

提供一个顶级函数 gzip,用于在缓冲区和/或文件之间执行“一次性”压缩。有关压缩过程的更精细控制,请参阅 “OO 接口” 部分。

use IO::Compress::Gzip qw(gzip $GzipError) ;

gzip $input_filename_or_reference => $output_filename_or_reference [,OPTS]
    or die "gzip failed: $GzipError\n";

函数式接口需要 Perl5.005 或更高版本。

gzip $input_filename_or_reference => $output_filename_or_reference [, OPTS]

gzip 至少需要两个参数,$input_filename_or_reference$output_filename_or_reference,以及零个或更多个可选参数(请参阅 “可选参数”

$input_filename_or_reference 参数

参数 $input_filename_or_reference 用于定义未压缩数据的来源。

它可以采用以下形式之一

文件名

如果 $input_filename_or_reference 参数是一个简单的标量,则假定它是一个文件名。将打开此文件进行读取,并将从中读取输入数据。

文件句柄

如果 $input_filename_or_reference 参数是一个文件句柄,则将从中读取输入数据。字符串“ - ”可用作标准输入的别名。

标量引用

如果 $input_filename_or_reference 是一个标量引用,则将从 $$input_filename_or_reference 中读取输入数据。

数组引用

如果 $input_filename_or_reference 是一个数组引用,则数组中的每个元素都必须是一个文件名。

将依次从每个文件中读取输入数据。

将遍历整个数组以确保它仅包含有效文件名,然后再压缩任何数据。

输入 FileGlob 字符串

如果 $input_filename_or_reference 是一个以字符“<”和“>”分隔的字符串,gzip 将假定它是一个输入 FileGlob 字符串。输入是与 FileGlob 匹配的文件列表。

有关更多详细信息,请参阅 File::GlobMapper

如果 $input_filename_or_reference 参数是任何其他类型,则将返回 undef

此外,如果$input_filename_or_reference是一个简单的文件名,则NameTime选项的默认值将从该文件中获取。

如果你不想使用这些默认值,可以通过显式设置NameTime选项或设置Minimal参数来覆盖它们。

$output_filename_or_reference参数

参数$output_filename_or_reference用于控制压缩数据的目标。此参数可以采用以下形式之一。

文件名

如果$output_filename_or_reference参数是一个简单的标量,则假定它是一个文件名。将打开此文件进行写入,并将压缩数据写入其中。

文件句柄

如果$output_filename_or_reference参数是一个文件句柄,则压缩数据将写入其中。字符串'-'可用作标准输出的别名。

标量引用

如果$output_filename_or_reference是一个标量引用,则压缩数据将存储在$$output_filename_or_reference中。

数组引用

如果$output_filename_or_reference是一个数组引用,则压缩数据将推送到数组中。

输出文件通配符

如果$output_filename_or_reference是一个以字符“<”和“>”分隔的字符串,gzip将假定它是一个输出文件通配符字符串。输出是与文件通配符匹配的文件列表。

$output_filename_or_reference是一个文件通配符字符串时,$input_filename_or_reference也必须是一个文件通配符字符串。其他任何内容都是错误的。

有关更多详细信息,请参阅 File::GlobMapper

如果$output_filename_or_reference参数是任何其他类型,则将返回undef

注释

$input_filename_or_reference映射到多个文件/缓冲区,而$output_filename_or_reference是单个文件/缓冲区时,输入文件/缓冲区将作为压缩数据流的串联系列存储在$output_filename_or_reference中。

可选参数

单次函数gzip的可选参数(在大多数情况下)与在“构造函数选项”部分中定义的 OO 接口中使用的参数相同。例外情况如下所列

AutoClose => 0|1

此选项适用于gzip的任何输入或输出数据流,这些数据流是文件句柄。

如果指定了 AutoClose,并且值为 true,则在 gzip 完成后,所有输入和/或输出文件句柄都将关闭。

此参数的默认值为 0。

BinModeIn => 0|1

此选项现在为 no-op。所有文件都将以二进制模式读取。

Append => 0|1

此选项的行为取决于输出数据流的类型。

  • 缓冲区

    如果启用了 Append,所有压缩数据都将附加到输出缓冲区的末尾。否则,在向输出缓冲区写入任何压缩数据之前,将清除输出缓冲区。

  • 文件名

    如果启用了 Append,文件将以追加模式打开。否则,在向其中写入任何压缩数据之前,将截断文件(如果存在)的内容。

  • 文件句柄

    如果启用了 Append,将在向其中写入任何压缩数据之前,通过调用 seek 将文件句柄定位到文件的末尾。否则,文件指针将不会移动。

当指定 Append 并将其设置为 true 时,它会将所有压缩数据附加到输出数据流。

因此,当输出是文件句柄时,它会在写入任何压缩数据之前执行对 eof 的查找。如果输出是文件名,它将打开以追加。如果输出是缓冲区,所有压缩数据都将附加到现有缓冲区。

相反,当未指定 Append 或存在且设置为 false 时,它将按如下方式操作。

当输出是文件名时,它会在写入任何压缩数据之前截断文件的内容。如果输出是文件句柄,它的位置将不会改变。如果输出是缓冲区,它将在输出任何压缩数据之前被擦除。

默认为 0。

示例

以下是一些显示模块功能的示例。

流式处理

这个非常简单的命令行示例演示了模块的流式处理功能。代码从 STDIN 读取数据,对其进行压缩,并将压缩数据写入 STDOUT。

$ echo hello world | perl -MIO::Compress::Gzip=gzip -e 'gzip \*STDIN => \*STDOUT' >output.gz

特殊文件名 "-" 可用作 \*STDIN\*STDOUT 的替身,因此上述内容可重写为

$ echo hello world | perl -MIO::Compress::Gzip=gzip -e 'gzip "-" => "-"' >output.gz

从文件系统压缩文件

要读取文件 file1.txt 的内容并将压缩数据写入文件 file1.txt.gz

use strict ;
use warnings ;
use IO::Compress::Gzip qw(gzip $GzipError) ;

my $input = "file1.txt";
gzip $input => "$input.gz"
    or die "gzip failed: $GzipError\n";

从文件句柄读取并写入内存缓冲区

要从现有 Perl 文件句柄 $input 读取并压缩数据写入缓冲区 $buffer

use strict ;
use warnings ;
use IO::Compress::Gzip qw(gzip $GzipError) ;
use IO::File ;

my $input = IO::File->new( "<file1.txt" )
    or die "Cannot open 'file1.txt': $!\n" ;
my $buffer ;
gzip $input => \$buffer
    or die "gzip failed: $GzipError\n";

压缩多个文件

要压缩目录 "/my/home" 中所有匹配 "*.txt" 的文件并将压缩数据存储在同一目录中

use strict ;
use warnings ;
use IO::Compress::Gzip qw(gzip $GzipError) ;

gzip '</my/home/*.txt>' => '<*.gz>'
    or die "gzip failed: $GzipError\n";

如果您想一次压缩一个文件,这将奏效

use strict ;
use warnings ;
use IO::Compress::Gzip qw(gzip $GzipError) ;

for my $input ( glob "/my/home/*.txt" )
{
    my $output = "$input.gz" ;
    gzip $input => $output
        or die "Error compressing '$input': $GzipError\n";
}

OO 接口

构造函数

IO::Compress::Gzip 的构造函数格式如下所示

my $z = IO::Compress::Gzip->new( $output [,OPTS] )
    or die "IO::Compress::Gzip failed: $GzipError\n";

成功时返回 IO::Compress::Gzip 对象,失败时返回 undef。失败时,变量 $GzipError 将包含错误消息。

如果您运行的是 Perl 5.005 或更高版本,从 IO::Compress::Gzip 返回的对象 $z 可以完全像 IO::File 文件句柄一样使用。这意味着可以使用 $z 执行所有常规输出文件操作。例如,要写入压缩文件/缓冲区,您可以使用以下任一形式

$z->print("hello world\n");
print $z "hello world\n";

强制参数 $output 用于控制压缩数据的目标。此参数可以采用以下形式之一。

文件名

如果 $output 参数是一个简单的标量,则假定它是一个文件名。此文件将被打开以供写入,压缩数据将被写入其中。

文件句柄

如果 $output 参数是一个文件句柄,则压缩数据将被写入其中。字符串 '-' 可用作标准输出的别名。

标量引用

如果 $output 是一个标量引用,则压缩数据将存储在 $$output 中。

如果 $output 参数是任何其他类型,则 IO::Compress::Gzip::new 将返回 undef。

构造函数选项

OPTS 是以下选项的任意组合(零个或多个)

自动关闭 => 0|1

此选项仅在 $output 参数是文件句柄时有效。如果指定且值为 true,则当调用 close 方法或销毁 IO::Compress::Gzip 对象时,将关闭 $output

此参数的默认值为 0。

追加 => 0|1

以追加模式打开 $output

此选项的行为取决于 $output 的类型。

  • 缓冲区

    如果 $output 是一个缓冲区并且 Append 已启用,所有压缩数据将附加到 $output 的末尾。否则,在向 $output 写入任何数据之前,将清除 $output

  • 文件名

    如果 $output 是一个文件名并且 Append 已启用,则该文件将以追加模式打开。否则,在向 $output 写入任何压缩数据之前,将截断该文件的内容(如果存在)。

  • 文件句柄

    如果 $output 是一个文件句柄,则在向 $output 写入任何压缩数据之前,将通过调用 seek 将文件指针定位到文件末尾。否则,文件指针将不会移动。

此参数的默认值为 0。

Merge => 0|1

此选项用于压缩输入数据并将其附加到 $output 中的现有压缩数据流。最终结果是存储在 $output 中的单个压缩数据流。

$output 不是 RFC 1952 数据流时,尝试使用此选项将导致致命错误。

Merge 选项还有许多其他限制

  1. 此模块需要使用 zlib 1.2.1 或更高版本才能工作。如果 Merge 与较旧版本的 zlib 一起使用,将引发致命错误。

  2. 如果 $output 是一个文件或文件句柄,则它必须是可寻址的。

此参数的默认值为 0。

-Level

定义 zlib 使用的压缩级别。该值应为 0 到 9 之间的一个数字(0 表示无压缩,9 表示最大压缩),或下面定义的符号常量之一。

Z_NO_COMPRESSION
Z_BEST_SPEED
Z_BEST_COMPRESSION
Z_DEFAULT_COMPRESSION

默认值为 Z_DEFAULT_COMPRESSION。

请注意,这些常量默认情况下不会被 IO::Compress::Gzip 导入。

use IO::Compress::Gzip qw(:strategy);
use IO::Compress::Gzip qw(:constants);
use IO::Compress::Gzip qw(:all);
-Strategy

定义用于调整压缩的策略。使用下面定义的符号常量之一。

Z_FILTERED
Z_HUFFMAN_ONLY
Z_RLE
Z_FIXED
Z_DEFAULT_STRATEGY

默认值为 Z_DEFAULT_STRATEGY。

Minimal => 0|1

如果指定,此选项将强制创建 RFC 1952 中定义的最小可能的兼容 gzip 头(其长度正好为 10 个字节)。

有关 gzip 标头中字段所用值的定义,请参阅 RFC 1952 中标题为“合规性”的部分。

如果此参数设置为 1,则将忽略所有其他控制 gzip 标头内容的参数。

此参数的默认值为 0。

Comment => $comment

$comment 的内容存储在 gzip 标头的 COMMENT 字段中。默认情况下,不会将注释字段写入 gzip 文件。

如果启用了 -Strict 选项,则注释只能包含 ISO 8859-1 字符加上换行符。

如果禁用了 -Strict 选项,则注释字段可以包含除 NULL 之外的任何字符。如果存在任何空字符,则字段将从第一个 NULL 处截断。

Name => $string

$string 的内容存储在 gzip NAME 标头字段中。如果未指定 Name,则不会创建 gzip NAME 字段。

如果启用了 -Strict 选项,则 $string 只能包含 ISO 8859-1 字符。

如果禁用了 -Strict,则 $string 可以包含除 NULL 之外的任何字符。如果存在任何空字符,则字段将从第一个 NULL 处截断。

Time => $number

将 gzip 标头中的 MTIME 字段设置为 $number。

如果未指定此选项,则此字段默认为创建 IO::Compress::Gzip 对象的时间。

TextFlag => 0|1

此参数控制 gzip 标头中 FLG.FTEXT 位的设置。它用于表示存储在 gzip 文件/缓冲区中的数据可能是文本。

默认值为 0。

HeaderCRC => 0|1

如果为真,此参数将在 gzip 标头中将 FLG.FHCRC 位设置为 1,并将 CRC16 标头字段设置为除 CRC16 字段本身之外的整个 gzip 标头的 CRC。

注意,如果使用 HeaderCRC 标志设置为 1 创建 gzip 文件,则大多数(如果不是全部)标准 gunzip 实用程序(尤其是 gzip 版本 1.2.4)都无法读取该文件。因此,如果您希望最大程度地提高 gzip 文件的可移植性,则应避免使用此选项。

此参数的默认值为 0。

OS_Code => $value

$value 存储在 gzip OS 标头字段中。0 到 255 之间的数字有效。

如果未指定,此参数默认为构建此模块的操作系统的操作系统代码。值 3 用作所有 Unix 变体和未知操作系统的通用值。

ExtraField => $data

此参数允许将其他元数据存储在 gzip 标头中的 ExtraField 中。符合 RFC 1952 的 ExtraField 由零个或多个子字段组成。每个子字段由一个两字节头后跟子字段数据组成。

可以使用以下任何格式提供子字段列表

-ExtraField => [$id1, $data1,
                $id2, $data2,
                 ...
               ]
-ExtraField => [ [$id1 => $data1],
                 [$id2 => $data2],
                 ...
               ]
-ExtraField => { $id1 => $data1,
                 $id2 => $data2,
                 ...
               }

其中 $id1$id2 是两字节子字段 ID。ID 的第二个字节不能为 0,除非已禁用 Strict 选项。

如果您使用哈希语法,则无法控制 ExtraSubFields 的存储顺序,而且不能有具有重复 ID 的 SubFields。

或者,可以将子字段列表作为标量提供,如下所示

-ExtraField => $rawdata

如果您使用原始格式,并且启用了 Strict 选项,IO::Compress::Gzip 将检查 $rawdata 是否由零个或多个符合规范的子字段组成。禁用 Strict 时,$rawdata 可以由任何任意字节流组成。

Extra Field 的最大大小为 65535 字节。

ExtraFlags => $value

将 gzip 标头中的 XFL 字节设置为 $value

如果此选项不存在,则 XFL 字段中存储的值将由 Level 选项的设置决定。

如果已指定 Level => Z_BEST_SPEED,则 XFL 设置为 2。如果已指定 Level => Z_BEST_COMPRESSION,则 XFL 设置为 4。否则,XFL 设置为 0。

Strict => 0|1

Strict 将选择性地检查与其他选项一起提供的值,以确保它们符合 RFC1952。

此选项默认启用。

如果启用了 Strict,将检查以下行为

  • 使用 Name 选项提供的值只能包含 ISO 8859-1 字符。

  • 使用 Comment 选项提供的值只能包含 ISO 8859-1 字符和换行符。

  • 使用 -Name-Comment 选项提供的值不能包含多个嵌入式空值。

  • 如果指定了 ExtraField 选项并且它是一个简单的标量,则它必须符合 RFC 1952 中定义的子字段结构。

  • 如果指定了 ExtraField 选项,将在每个子字段中检查 ID 的第二个字节,以确保它不包含保留值 0x00。

Strict 被禁用时,将执行以下行为策略

  • 使用 -Name 选项提供的值可以包含除 NULL 之外的任何字符。

  • 使用 -Comment 选项提供的值可以包含除 NULL 之外的任何字符。

  • 使用 -Name-Comment 选项提供的值可以包含多个嵌入式空值。写入 gzip 标头的字符串将由字符组成,直到(但不包括)第一个嵌入式 NULL。

  • 如果指定了 ExtraField 选项并且它是一个简单的标量,则不会检查结构。唯一的错误是长度过大。

  • ExtraField 子字段中的 ID 标头可以由任意两个字节组成。

示例

TODO

方法

print

用法是

$z->print($data)
print $z $data

压缩并输出 $data 参数的内容。这与 print 内置函数的行为相同。

如果成功,则返回 true。

printf

用法是

$z->printf($format, $data)
printf $z $format, $data

压缩并输出 $data 参数的内容。

如果成功,则返回 true。

syswrite

用法是

$z->syswrite $data
$z->syswrite $data, $length
$z->syswrite $data, $length, $offset

压缩并输出 $data 参数的内容。

返回未压缩的已写入字节数,或在不成功时返回 undef

write

用法是

$z->write $data
$z->write $data, $length
$z->write $data, $length, $offset

压缩并输出 $data 参数的内容。

返回未压缩的已写入字节数,或在不成功时返回 undef

flush

用法是

$z->flush;
$z->flush($flush_type);

将所有待处理的压缩数据刷新到输出文件/缓冲区。

此方法采用一个可选参数 $flush_type,它控制刷新将如何执行。默认情况下,使用的 $flush_typeZ_FINISH$flush_type 的其他有效值为 Z_NO_FLUSHZ_SYNC_FLUSHZ_FULL_FLUSHZ_BLOCK。强烈建议只有在您完全理解其含义的情况下才设置 flush_type 参数 - 过度使用 flush 会严重降低达到的压缩级别。有关详细信息,请参阅 zlib 文档。

成功时返回 true。

tell

用法是

$z->tell()
tell $z

返回未压缩的文件偏移量。

eof

用法是

$z->eof();
eof($z);

如果已调用 close 方法,则返回 true。

seek

$z->seek($position, $whence);
seek($z, $position, $whence);

提供 seek 功能的一个子集,限制是只能在输出文件/缓冲区中向前查找。尝试向后查找将导致致命错误。

文件/缓冲区的空部分将写入 NULL (0x00) 字节。

$whence 参数采用一个通常的值,即 SEEK_SET、SEEK_CUR 或 SEEK_END。

成功时返回 1,失败时返回 0。

binmode

用法是

$z->binmode
binmode $z ;

这是一个为完整性提供的空操作。

opened

$z->opened()

如果对象当前引用已打开的文件/缓冲区,则返回 true。

autoflush

my $prev = $z->autoflush()
my $prev = $z->autoflush(EXPR)

如果 $z 对象与文件或文件句柄关联,则此方法将返回底层文件句柄的当前自动刷新设置。如果 EXPR 存在且非零,则它将在每次写入/打印操作后启用刷新。

如果 $z 与缓冲区关联,则此方法无效,且始终返回 undef

注意,特殊变量 $| 不能用于设置或检索自动刷新设置。

input_line_number

$z->input_line_number()
$z->input_line_number(EXPR)

压缩时,此方法始终返回 undef

fileno

$z->fileno()
fileno($z)

如果 $z 对象与文件或文件句柄关联,则 fileno 将返回底层文件描述符。一旦调用 close 方法,fileno 将返回 undef

如果 $z 对象与缓冲区关联,则此方法将返回 undef

close

$z->close() ;
close $z ;

刷新所有待处理的压缩数据,然后关闭输出文件/缓冲区。

对于大多数版本的 Perl,如果 IO::Compress::Gzip 对象被销毁(显式地或通过引用该对象的变量超出范围),此方法将自动调用。例外是 Perl 版本 5.005 至 5.00504 和 5.8.0。在这些情况下,close 方法将自动调用,但直到程序终止时所有活动对象进行全局销毁时才调用。

因此,如果你希望你的脚本能够在所有版本的 Perl 上运行,则应该显式调用 close,而不依赖于自动关闭。

成功时返回 true,否则返回 0。

如果在创建 IO::Compress::Gzip 对象时启用了 AutoClose 选项,并且该对象与文件关联,则还会关闭底层文件。

newStream([OPTS])

用法是

$z->newStream( [OPTS] )

关闭当前压缩数据流并启动一个新的数据流。

OPTS 包含创建 $z 对象时可用的任何选项。

有关更多详细信息,请参阅 "构造函数选项" 部分。

deflateParams

用法是

$z->deflateParams

TODO

导入

IO::Compress::Gzip 中的某些方法需要一些符号常量。默认情况下不导入任何常量。

:all

导入 gzip$GzipErrorIO::Compress::Gzip 可使用的所有符号常量。与执行以下操作相同

use IO::Compress::Gzip qw(gzip $GzipError :constants) ;
:constants

导入所有符号常量。与执行以下操作相同

use IO::Compress::Gzip qw(:flush :level :strategy) ;
:flush

这些符号常量由 flush 方法使用。

Z_NO_FLUSH
Z_PARTIAL_FLUSH
Z_SYNC_FLUSH
Z_FULL_FLUSH
Z_FINISH
Z_BLOCK
:level

这些符号常量由构造函数中的 Level 选项使用。

Z_NO_COMPRESSION
Z_BEST_SPEED
Z_BEST_COMPRESSION
Z_DEFAULT_COMPRESSION
:strategy

这些符号常量由构造函数中的 Strategy 选项使用。

Z_FILTERED
Z_HUFFMAN_ONLY
Z_RLE
Z_FIXED
Z_DEFAULT_STRATEGY

示例

Apache::GZip 再探

请参阅 IO::Compress::FAQ

与 Net::FTP 配合使用

请参阅 IO::Compress::FAQ

支持

应将一般反馈/问题/错误报告发送至 https://github.com/pmqs/IO-Copress/issues(首选)或 https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Copress

另请参阅

Compress::ZlibIO::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 [email protected] 和 Mark Adler [email protected] 编写。

zlib 压缩库的主要站点为 http://www.zlib.org

zlib-ng 压缩库的主要站点为 https://github.com/zlib-ng/zlib-ng

gzip 的主要站点为 http://www.gzip.org

作者

此模块由 Paul Marquess 编写,[email protected]

修改历史

请参阅 Changes 文件。

版权和许可证

版权所有 (c) 2005-2023 Paul Marquess。保留所有权利。

此程序为免费软件;您可以在与 Perl 自身相同的条款下重新分发或修改它。