为什么不是Perl的File :: GlobMapper导出globmap?

时间:2010-04-25 19:10:19

标签: perl

从文档中可以很好地复制以下内容。

    use File::GlobMapper qw( globmap );

    for my $pair (globmap '<*.tar.gz>' => '<#1.tgz>' )
     {
     }

它给出了

    String found where operator expected at globmapper_test1.pl line 4, near "globmap '<*.tar.gz>'"
            (Do you need to predeclare globmap?)

(在Windows上使用ActivePerl 5.10.0)

附带问题 - 如果GlobMapper只导出一个函数,为什么要设置它以便你必须明确导出它?

3 个答案:

答案 0 :(得分:3)

这是File::GlobMapper中的错误。它设置了@EXPORT_OK变量,但实际上并未使用Exporter

但它变得更糟。 globmap不返回arrayrefs列表(如文档中所述)。它确实返回了一个arrayrefs的arrayref。所以你真的要写:

use File::GlobMapper; 

for my $pair (@{ File::GlobMapper::globmap('<*.tar.gz>' => '<#1.tgz>') }) { 
  my ($from, $to) = @$pair;
} 

答案 1 :(得分:1)

我从未使用过File::GlobMapper,但我刚从CPAN下载它,并且 我转载了你的信息。解决此问题的一种方法是使用完全限定的呼叫 到globmap函数。尝试这样的东西:

use File::GlobMapper; 

for my $pair (File::GlobMapper::globmap('<*.tar.gz>' => '<#1.tgz>')) 
 { 
 } 

看来POD没有显示使用代码的正确方法。 您可以提交有关CPAN的错误报告。如果你包括一个补丁最好 POD。

查看GlobMapper.pm的源代码,似乎它实际上并没有使用Exporter模块。这将解释错误消息。我不认为代码可以导出任何函数。

答案 2 :(得分:1)

对于您的附带问题:要导出的子程序名称无关紧要。不隐式导入是一个好主意,所以你不要踩踏调用文件已经完成的任何事情。