这是一个简单的例子来说明我在尝试使用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";
但我试图避免这种情况,因为该库很少在应用程序中使用。有什么明显的东西我做错了,还是这个特定于这个模块的行为?
答案 0 :(得分:3)
这一行:
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)
解析器无法解释这一点。