perl从模块声明和导出变量

时间:2014-05-27 21:18:25

标签: perl perl-module

我需要修改一堆脚本来做相当于直接C风格的"包含"中等数量的变量。 "使用"将它们拉入其中应该就像包含这样的一行一样:

my $os_name = "Windows"; #declares the variable AND sets its value

这样他们就可以用在"呼叫"脚本。模块中有一些逻辑可以有条件地设置这些变量的值。这些脚本都有"使用strict"。一个典型的"来电者"有:

use strict;
use File::Basename;
use lib dirname (__FILE__);
use os_specific;
print "DEBUG os_name $os_name\n";

和模块(os_specific.pm)有:

package os_specific;
use warnings;
use strict;
use Exporter;
our @EXPORT = qw($os_name);
our $os_name="Windows";
1

但它不起作用,有编译阶段警告,如:

Global symbol "$os_name" requires explicit package name at caller.pl.

因此,模块中变量的声明在调用者的范围内无效。

可以这样做,还是必须在caller.pl中声明每个变量? (所有回复请使用"使用严格" - 没有它可以使用"要求"。这不能使用"使用严格"虽然因为它会抛出编译时错误。)

我知道模块中的变量可以用作" $ os_specific :: os_name",问题是如何设置它以便它们可以用作" $ os_name&# 34。

感谢。

2 个答案:

答案 0 :(得分:4)

问题是您不能继承Exporter的任何功能,因为您还没有设置@ISA包变量。

在修复软件包名称后,您的模块应该如下所示(软件包应仅按照惯例使用大写和小写字母),并且应位于文件OSSpecific.pm

package OSSpecific;

use strict;
use warnings;

use Exporter;
our @ISA    = qw/ Exporter /;
our @EXPORT = qw/ $os_name /;

our $os_name = "Windows";

1;

答案 1 :(得分:2)

您需要在包中使用明确的import方法,如Exporter中所示。

您还需要修复包名称,文件名和用法语句的大小写,以便它们全部匹配。

OS_Specific.pm

package OS_Specific;
use warnings;
use strict;
use Exporter qw(import);

另一个文件:

use OS_Specific;

查看perlstyle,了解有关选择包名称的有用指南:

  

Perl非正式地保留" pragma"的小写模块名称。像integerstrict这样的模块。其他模块应以大写字母开头并使用大小写混合,但由于原始文件系统的限制,可能没有下划线。模块名称的表示形式为必须适合几个稀疏字节的文件。