IO::Uncompress::Gunzip - 读取 RFC 1952 文件/缓冲区
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
my $status = gunzip $input => $output [,OPTS]
or die "gunzip failed: $GunzipError\n";
my $z = IO::Uncompress::Gunzip->new( $input [OPTS] )
or die "gunzip failed: $GunzipError\n";
$status = $z->read($buffer)
$status = $z->read($buffer, $length)
$status = $z->read($buffer, $length, $offset)
$line = $z->getline()
$char = $z->getc()
$char = $z->ungetc()
$char = $z->opened()
$status = $z->inflateSync()
$data = $z->trailingData()
$status = $z->nextStream()
$data = $z->getHeaderInfo()
$z->tell()
$z->seek($position, $whence)
$z->binmode()
$z->fileno()
$z->eof()
$z->close()
$GunzipError ;
# IO::File mode
<$z>
read($z, $buffer);
read($z, $buffer, $length);
read($z, $buffer, $length, $offset);
tell($z)
seek($z, $position, $whence)
binmode($z)
fileno($z)
eof($z)
close($z)
此模块提供了一个 Perl 接口,允许读取符合 RFC 1952 的文件/缓冲区。
有关写入 RFC 1952 文件/缓冲区,请参见配套模块 IO::Compress::Gzip。
提供了一个顶级函数 gunzip
,用于在缓冲区和/或文件之间执行“一次性”解压缩。有关解压缩过程的更精细控制,请参见 "面向对象接口" 部分。
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
gunzip $input_filename_or_reference => $output_filename_or_reference [,OPTS]
or die "gunzip failed: $GunzipError\n";
函数式接口需要 Perl5.005 或更高版本。
gunzip
至少需要两个参数,$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
是一个数组引用,则数组中的每个元素都必须是一个文件名。
输入数据将依次从每个文件读取。
将遍历整个数组以确保它只包含有效的文件名,然后再解压缩任何数据。
如果$input_filename_or_reference
是一个由字符“<”和“>”分隔的字符串,gunzip
将假定它是一个输入文件通配符字符串。输入是与文件通配符匹配的文件列表。
有关更多详细信息,请参阅File::GlobMapper。
如果$input_filename_or_reference
参数是任何其他类型,则将返回undef
。
$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
是一个用字符“<”和“>”分隔的字符串,gunzip
将假设它是一个输出文件通配符字符串。输出是与文件通配符匹配的文件列表。
当 $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
将包含来自每个输入文件/缓冲区的全部解压缩数据的串联。
单次函数 gunzip
的可选参数(在大多数情况下)与在 "构造函数选项" 部分中定义的 OO 接口使用的参数相同。例外情况如下所示
AutoClose => 0|1
此选项适用于任何作为文件句柄的 gunzip
的输入或输出数据流。
如果指定了 AutoClose
,并且值为真,则 gunzip
完成后将导致所有输入和/或输出文件句柄关闭。
此参数默认为 0。
BinModeOut => 0|1
此选项现在是一个无操作选项。所有文件都将以二进制模式写入。
Append => 0|1
此选项的行为取决于输出数据流的类型。
缓冲区
如果启用了 Append
,所有解压缩的数据将被追加到输出缓冲区的末尾。否则,在写入任何解压缩数据之前,将清除输出缓冲区。
文件名
如果启用了Append
,文件将以追加模式打开。否则,文件的内容(如果有)将在任何未压缩数据写入文件之前被截断。
文件句柄
如果启用了Append
,在任何未压缩数据写入文件之前,文件句柄将通过调用seek
定位到文件末尾。否则,文件指针将不会移动。
当Append
被指定并设置为 true 时,它将追加所有未压缩数据到输出数据流。
因此,当输出是文件句柄时,它将在写入任何未压缩数据之前执行 seek 到文件末尾的操作。如果输出是文件名,它将被打开以进行追加。如果输出是缓冲区,所有未压缩数据将被追加到现有缓冲区。
相反,当Append
未指定,或它存在并设置为 false 时,它将按如下方式操作。
当输出是文件名时,它将在写入任何未压缩数据之前截断文件的内容。如果输出是文件句柄,它的位置将不会改变。如果输出是缓冲区,它将在输出任何未压缩数据之前被清除。
默认值为 0。
MultiStream => 0|1
如果输入文件/缓冲区包含多个压缩数据流,此选项将把所有数据流解压缩为单个数据流。
默认值为 0。
TrailingData => $scalar
返回解压缩完成后,紧随压缩数据流之后存在的任何数据。
当压缩数据流之后存在有用的信息,并且您不知道压缩数据流的长度时,可以使用此选项。
如果输入是缓冲区,trailingData
将返回从压缩数据流末尾到缓冲区末尾的所有内容。
如果输入是文件句柄,trailingData
将返回在到达压缩数据流末尾后,留在文件句柄输入缓冲区中的数据。然后,您可以使用文件句柄读取输入文件的其余部分。
如果输入是文件名,请不要使用trailingData
。
如果您在开始解压缩之前知道压缩数据流的长度,您可以通过设置InputLength
选项来避免使用trailingData
。
要读取文件 file1.txt.gz
的内容并将解压缩后的数据写入文件 file1.txt
。
use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
my $input = "file1.txt.gz";
my $output = "file1.txt";
gunzip $input => $output
or die "gunzip failed: $GunzipError\n";
要从现有的 Perl 文件句柄 $input
读取数据并将解压缩后的数据写入缓冲区 $buffer
。
use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
use IO::File ;
my $input = IO::File->new( "<file1.txt.gz" )
or die "Cannot open 'file1.txt.gz': $!\n" ;
my $buffer ;
gunzip $input => \$buffer
or die "gunzip failed: $GunzipError\n";
要解压缩目录 "/my/home" 中所有匹配 "*.txt.gz" 的文件并将解压缩后的数据存储在同一目录中
use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
gunzip '</my/home/*.txt.gz>' => '</my/home/#1.txt>'
or die "gunzip failed: $GunzipError\n";
如果你想一次压缩一个文件,这个方法可以做到
use strict ;
use warnings ;
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
for my $input ( glob "/my/home/*.txt.gz" )
{
my $output = $input;
$output =~ s/.gz// ;
gunzip $input => $output
or die "Error compressing '$input': $GunzipError\n";
}
下面显示了 IO::Uncompress::Gunzip 构造函数的格式
my $z = IO::Uncompress::Gunzip->new( $input [OPTS] )
or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
成功时返回一个 IO::Uncompress::Gunzip
对象,失败时返回 undef。变量 $GunzipError
将在失败时包含错误消息。
如果你运行的是 Perl 5.005 或更高版本,从 IO::Uncompress::Gunzip 返回的对象 $z
可以像 IO::File 文件句柄一样使用。这意味着所有正常的输入文件操作都可以使用 $z
执行。例如,要从压缩文件/缓冲区读取一行,可以使用以下两种形式之一
$line = $z->getline();
$line = <$z>;
必需参数 $input
用于确定压缩数据的来源。此参数可以采用三种形式之一。
如果 $input
参数是标量,则假定它是一个文件名。此文件将被打开以供读取,压缩数据将从其中读取。
如果 $input
参数是文件句柄,则压缩数据将从其中读取。字符串 '-' 可以用作标准输入的别名。
如果 $input
是标量引用,则压缩数据将从 $$input
读取。
下面定义的选项名称不区分大小写,并且可以选择以 '-' 为前缀。因此,以下所有内容都是有效的
-AutoClose
-autoclose
AUTOCLOSE
autoclose
OPTS 是以下选项的组合
AutoClose => 0|1
此选项仅在 $input
参数是文件句柄时有效。如果指定,并且值为 true,它将导致文件在调用 close
方法或销毁 IO::Uncompress::Gunzip 对象后关闭。
此参数默认为 0。
MultiStream => 0|1
允许将多个连接的压缩流视为单个压缩流。解压缩将在以下情况之一发生时停止:到达文件/缓冲区的末尾、遇到错误(提前结束、压缩数据损坏)或流的末尾没有紧跟着另一个流的开头。
此参数默认为 0。
Prime => $string
此选项将在处理输入文件/缓冲区之前解压缩 $string
的内容。
当压缩数据嵌入在另一个文件/数据结构中,并且无法在不读取前几个字节的情况下确定压缩数据从何处开始时,此选项很有用。如果是这种情况,可以使用此选项用这些字节对解压缩进行预处理。
Transparent => 0|1
如果设置了此选项,并且输入文件/缓冲区不是压缩数据,则模块将允许读取它。
此外,如果输入文件/缓冲区确实包含压缩数据,并且紧随其后的是非压缩数据,则设置此选项将使此模块将整个文件/缓冲区视为单个数据流。
此选项默认为 1。
BlockSize => $num
读取压缩输入数据时,IO::Uncompress::Gunzip 将以 $num
字节的块大小读取它。
此选项默认为 4096。
InputLength => $size
如果存在此选项,它将限制从输入文件/缓冲区读取的压缩字节数为 $size
。此选项可用于压缩数据流之后存在有用数据的情况,并且您事先知道压缩数据流的确切长度。
此选项主要用于从文件句柄读取时,在这种情况下,文件指针将指向压缩数据流之后的第一个字节。
此选项默认为关闭。
Append => 0|1
此选项控制 read
方法对未压缩数据执行的操作。
如果设置为 1,所有未压缩数据将附加到 read
方法的输出参数。
如果设置为 0,read
方法的输出参数的内容将被未压缩数据覆盖。
默认值为 0。
Strict => 0|1
此选项控制在执行解压缩时是否使用下面定义的额外检查。当 Strict 打开时,会执行额外的测试,当 Strict 关闭时,不会执行。
此选项的默认值为关闭。
如果 gzip FLG 标头字节中设置了 FHCRC 位,则标头中的 CRC16 字节必须与实际读取的 gzip 标头的 crc16 值匹配。
如果 gzip 标头包含名称字段 (FNAME),则它仅包含 ISO 8859-1 字符。
如果 gzip 标头包含注释字段 (FCOMMENT),则它仅包含 ISO 8859-1 字符加上换行符。
如果存在 gzip FEXTRA 标头字段,则它必须符合 RFC 1952 中定义的子字段结构。
CRC32 和 ISIZE 尾部字段必须存在。
读取的 CRC32 字段的值必须与 gzip 文件中实际包含的未压缩数据的 crc32 值匹配。
读取的 ISIZE 字段的值必须与实际从文件中读取的未压缩数据的长度匹配。
ParseExtra => 0|1
如果 gzip FEXTRA 头字段存在并且此选项已设置,它将强制模块检查它是否符合 RFC 1952 中定义的子字段结构。如果 Strict
选项开启,它将自动启用此选项。
默认值为 0。
待办事项
用法是
$status = $z->read($buffer)
读取一块压缩数据(压缩块的大小由构造函数中的 Buffer
选项决定),解压缩它并将任何解压缩的数据写入 $buffer
。如果在构造函数中设置了 Append
参数,则解压缩的数据将追加到 $buffer
参数。否则 $buffer
将被覆盖。
返回写入 $buffer
的解压缩字节数,如果遇到文件结尾则返回零,如果遇到错误则返回负数。
用法是
$status = $z->read($buffer, $length)
$status = $z->read($buffer, $length, $offset)
$status = read($z, $buffer, $length)
$status = read($z, $buffer, $length, $offset)
尝试将 $length
字节的解压缩数据读取到 $buffer
中。
此形式的 read
方法与前一个方法的主要区别在于,此方法将尝试返回正好 $length
字节。此函数无法返回 $length
字节的唯一情况是遇到文件结尾或 IO 错误。
返回写入 $buffer
的解压缩字节数,如果遇到文件结尾则返回零,如果遇到错误则返回负数。
用法是
$line = $z->getline()
$line = <$z>
读取一行。
此方法完全支持使用变量 $/
(或 $INPUT_RECORD_SEPARATOR
或 $RS
,当 English
处于使用状态时)来确定什么构成行尾。段落模式、记录模式和文件吞噬模式都受支持。
用法是
$char = $z->getc()
读取一个字符。
用法是
$char = $z->ungetc($string)
用法是
$status = $z->inflateSync()
待办事项
用法是
$hdr = $z->getHeaderInfo();
@hdrs = $z->getHeaderInfo();
此方法返回一个哈希引用(在标量上下文中)或一个哈希引用的列表(在数组上下文中),其中包含有关压缩数据流中每个头字段的信息。
如果存在,则为 Name 头字段的内容。如果不存在名称,则值为 undef。请注意,这与零长度名称不同,零长度名称将返回空字符串。
如果存在,则为 Comment 头字段的内容。如果不存在注释,则值为 undef。请注意,这与零长度注释不同,零长度注释将返回空字符串。
用法是
$z->tell()
tell $z
返回未压缩的文件偏移量。
用法是
$z->eof();
eof($z);
如果已到达压缩输入流的末尾,则返回 true。
$z->seek($position, $whence);
seek($z, $position, $whence);
提供 seek
功能的子集,限制是只能在输入文件/缓冲区中向前查找。尝试向后查找是致命错误。
请注意,此模块中 seek
的实现不提供对压缩文件/缓冲区的真正随机访问。它通过从文件/缓冲区中的当前偏移量解压缩数据,直到它到达 seek
参数中指定的未压缩偏移量。对于非常小的文件,这可能是可以接受的行为。对于大型文件,它可能会导致不可接受的延迟。
$whence
参数采用一个通常的值,即 SEEK_SET、SEEK_CUR 或 SEEK_END。
成功返回 1,失败返回 0。
用法是
$z->binmode
binmode $z ;
这是一个为了完整性而提供的空操作。
$z->opened()
如果对象当前引用打开的文件/缓冲区,则返回 true。
my $prev = $z->autoflush()
my $prev = $z->autoflush(EXPR)
如果 $z
对象与文件或文件句柄相关联,则此方法将返回底层文件句柄的当前自动刷新设置。如果存在 EXPR
且不为零,它将启用在每次写入/打印操作后刷新。
如果 $z
与缓冲区相关联,则此方法无效,始终返回 undef
。
注意,特殊变量 $|
不能用于设置或检索自动刷新设置。
$z->input_line_number()
$z->input_line_number(EXPR)
返回当前未压缩的行号。如果存在 EXPR
,它将设置行号。请注意,设置行号不会更改正在读取的文件/缓冲区中的当前位置。
$/
的内容用于确定构成行终止符的内容。
$z->fileno()
fileno($z)
如果 $z
对象与文件或文件句柄相关联,fileno
将返回底层文件描述符。调用 close
方法后,fileno
将返回 undef
。
如果 $z
对象与缓冲区相关联,则此方法将返回 undef
。
$z->close() ;
close $z ;
关闭输出文件/缓冲区。
对于大多数版本的 Perl,如果 IO::Uncompress::Gunzip 对象被销毁(无论是显式销毁还是对象引用所在的变量超出作用域),此方法将自动调用。例外情况是 Perl 版本 5.005 到 5.00504 和 5.8.0。在这些情况下,close
方法将自动调用,但直到程序终止时所有活动对象的全局销毁才会调用。
因此,如果您希望您的脚本能够在所有版本的 Perl 上运行,您应该显式调用 close
,而不要依赖于自动关闭。
成功返回 true,否则返回 0。
如果在创建 IO::Uncompress::Gunzip 对象时启用了 AutoClose
选项,并且该对象与文件相关联,则底层文件也将被关闭。
用法是
my $status = $z->nextStream();
跳到输入文件/缓冲区中的下一个压缩数据流。如果找到新的压缩数据流,则 eof 标记将被清除,$.
将被重置为 0。
如果找到新流,则返回 1;如果未找到,则返回 0;如果遇到错误,则返回 -1。
用法是
my $data = $z->trailingData();
返回解压缩完成后,压缩数据流之后立即存在的数据(如果有)。只有在遇到压缩数据流的末尾时,调用此方法才有意义。
当压缩数据流之后存在有用的信息,并且您不知道压缩数据流的长度时,可以使用此选项。
如果输入是缓冲区,trailingData
将返回从压缩数据流末尾到缓冲区末尾的所有内容。
如果输入是文件句柄,trailingData
将返回在到达压缩数据流末尾后,留在文件句柄输入缓冲区中的数据。然后,您可以使用文件句柄读取输入文件的其余部分。
如果输入是文件名,请不要使用trailingData
。
如果您在开始解压缩之前知道压缩数据流的长度,则可以通过在构造函数中设置 InputLength
选项来避免使用 trailingData
。
目前,IO::Uncompress::Gunzip 不需要任何符号常量。
导入 gunzip
和 $GunzipError
。与执行以下操作相同
use IO::Uncompress::Gunzip qw(gunzip $GunzipError) ;
一般反馈/问题/错误报告应发送至 https://github.com/pmqs/IO-Compress/issues(首选)或 https://rt.cpan.org/Public/Dist/Display.html?Name=IO-Compress。
Compress::Zlib,IO::Compress::Gzip,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 [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 本身相同的条款下重新发布和/或修改它。