IO :: Compress :: Gzip的功能接口未正确处理参数

时间:2015-11-19 14:38:21

标签: perl gzip

这是一个简单的例子来说明我在尝试使用IO :: Compress :: Gzip时遇到的问题:

use strict;
use warnings;

eval {
    require IO::Compress::Gzip;
    IO::Compress::Gzip->import();
    1;
} or do {
    my $error = $@;
        die "\nERROR: Couldn't load IO::Compress::Gzip" if $error;
};

my $input = shift;
my $out = $input.".gz";
print "Defined!\n" if defined $out;

IO::Compress::Gzip::gzip $input => $out 
    or die "gzip failed: $!\n";

这会产生以下错误:

Defined!
Use of uninitialized value $_[1] in string eq at /home/statonse/perl/perlbrew/perls/perl-5.22.0/lib/5.22.0/IO/Compress/Base/Common.pm line 280.
IO::Compress::Gzip::gzip: output filename is undef or null string at test.pl line 17.

但是,如果我使用对象接口:

use strict;
use warnings;

eval {
    require IO::Compress::Gzip;
    IO::Compress::Gzip->import();
    1;
} or do {
    my $error = $@;
    die "\nERROR: Couldn't load IO::Compress::Gzip" if $error;
};

my $input = shift;
my $out = $input.".gz";
print "Defined!\n" if defined $out;

my $z = new IO::Compress::Gzip $out
    or die "IO::Compress::Gzip failed: $!\n";

$z->print($input);

它运作得很好。对于某些上下文,如果我使用use:

导入模块,它将正常工作
use strict;
use warnings;
use IO::Compress::Gzip;

my $input = shift;
my $out = $input.".gz";

IO::Compress::Gzip::gzip $input => $out
    or die "gzip failed: $!\n";

但我试图避免这种情况,因为该库很少在应用程序中使用。有什么明显的东西我做错了,还是这个特定于这个模块的行为?

1 个答案:

答案 0 :(得分:3)

这一行:

IO::Compress::Gzip::gzip $input => $out

的解析方式不同,具体取决于解析器是否知道有一个名为IO::Compress::Gzip::gzip的函数。

使用use加载库时,在解析程序的其余部分之前,解析器会知道其函数(因为useBEGIN的类型)。在这种情况下,解析器会选择您想要的解释。

在另一种情况下,它选择备用解释:间接对象语法,相当于$input->IO::Compress::Gzip::gzip, $out

您可以通过在程序的不同版本上运行perl -MO=Deparse来自行查看。

修复方法是使用括号使函数调用显式:

IO::Compress::Gzip::gzip($input, $out)

解析器无法解释这一点。