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
加载库时,解析器会在程序的其余部分被解析之前就知道它的函数(因为 use
是 BEGIN
的一种类型)。在这种情况下,解析器会选择您想要的解释。
在另一种情况下,它选择替代解释:间接对象语法,相当于$input->IO::Compress::Gzip::gzip, $out
您可以通过 运行 perl -MO=Deparse
在您的程序的不同版本上亲自查看。
修复方法是使用括号显式调用函数:
IO::Compress::Gzip::gzip($input, $out)
解析器不会误解它。
这里有一个简单的例子来说明我在尝试使用 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
加载库时,解析器会在程序的其余部分被解析之前就知道它的函数(因为 use
是 BEGIN
的一种类型)。在这种情况下,解析器会选择您想要的解释。
在另一种情况下,它选择替代解释:间接对象语法,相当于$input->IO::Compress::Gzip::gzip, $out
您可以通过 运行 perl -MO=Deparse
在您的程序的不同版本上亲自查看。
修复方法是使用括号显式调用函数:
IO::Compress::Gzip::gzip($input, $out)
解析器不会误解它。