Bizzare问题从包中导入Perl变量

Mik*_*ike 0 perl

我正在尝试从Perl模块导入变量.我注意到它在变量名长度为一个字符时起作用,而在长度大于一的时候不起作用.我字面上甚至连现在都没有.

我知道你可以在Perl gotcha的名单中填满一个小体育场,但这很奇怪.为什么会这样?

例1)

mod.pm

use strict;
use warnings;

our $aa = 1;

1;
Run Code Online (Sandbox Code Playgroud)

test.pl

#!/usr/bin/perl

use warnings;
use strict;

use mod;

print $aa . "\n";
Run Code Online (Sandbox Code Playgroud)

运行它.它失败

$ ./test.pl
Variable "$aa" is not imported at ./test.pl line 8.
Global symbol "$aa" requires explicit package name at ./test.pl line 8.
Execution of ./test.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

例2)

mod.pm

use strict;
use warnings;

our $a = 1;

1;
Run Code Online (Sandbox Code Playgroud)

test.pl

#!/usr/bin/perl

use warnings;
use strict;

use mod;

print $a . "\n";
Run Code Online (Sandbox Code Playgroud)

运行它.它过去了

./test.pl
1
Run Code Online (Sandbox Code Playgroud)

另外,我的翻译的版本信息

$perl -v

This is perl 5, version 16, subversion 2 (v5.16.2) built for darwin-thread-multi-2level
Run Code Online (Sandbox Code Playgroud)

Mil*_*ler 5

$a并且$b是特殊变量sort.对于这种类型的测试,它们不是变量名称的良好选择.

至于如何让您的包导入工作,有几个步骤:

  1. 选择带有大写字母的包名称,因为小写意图为perl pragma保留perlstyle:

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

  2. 使用package与您的文件名相匹配的声明减去启动模块内容.pm.

这两件事将您的代码更改为以下内容:

MyMod.pm

package MyMod;

use strict;
use warnings;

our $var = 1;

1;
Run Code Online (Sandbox Code Playgroud)

test.pl

#!/usr/bin/perl

use warnings;
use strict;

use MyMod;

print $MyMod::var. "\n";
Run Code Online (Sandbox Code Playgroud)

最后,如果您想将变量实际导入命名空间,您只需要查看Exporter.