我需要修改一堆脚本来做相当于直接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。
感谢。
答案 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"的小写模块名称。像
integer
和strict
这样的模块。其他模块应以大写字母开头并使用大小写混合,但由于原始文件系统的限制,可能没有下划线。模块名称的表示形式为必须适合几个稀疏字节的文件。