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

Functional interface to IO::Compress::Gzip is not handling arguments correctly

这里有一个简单的例子来说明我在尝试使用 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";

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

这一行:

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)

解析器不会误解它。