Bizzare问题从包中导入Perl变量

时间:2014-07-18 03:49:57

标签: perl

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

我知道你可以用Perl gotcha的名单填补一个小体育场,但这是一个奇怪的。为什么会这样?

示例1)

mod.pm

use strict;
use warnings;

our $aa = 1;

1;

test.pl

#!/usr/bin/perl

use warnings;
use strict;

use mod;

print $aa . "\n";

运行它。它失败了

$ ./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.

示例2)

mod.pm

use strict;
use warnings;

our $a = 1;

1;

test.pl

#!/usr/bin/perl

use warnings;
use strict;

use mod;

print $a . "\n";

运行它。它通过

./test.pl
1

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

$perl -v

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

1 个答案:

答案 0 :(得分:5)

$a$bsort的特殊变量。对于这种类型的测试,它们不是变量名称的良好选择。

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

  1. 选择以大写字母开头的软件包名称,因为小写字母是为每perlstyle个perl pragma保留的:

      

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

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

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

    MyMod.pm

    package MyMod;
    
    use strict;
    use warnings;
    
    our $var = 1;
    
    1;
    

    test.pl

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    use MyMod;
    
    print $MyMod::var. "\n";
    

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