以下脚本on
正常工作:
p.pl
在文件use feature qw(say);
use strict;
use warnings;
use lib '.';
use P1;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
中定义了类P1
:
P1.pm
但是,当我尝试将类package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
1;
移动到主脚本中时:
P1.pm
我收到错误:
#! /usr/bin/env perl
use feature qw(say);
use strict;
use warnings;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
答案 0 :(得分:5)
has
只是一个在运行时执行的常规函数调用,因此在say
之后它才会运行。
通常你use
Moose一个use Class;
,而BEGIN { require Class; ... }
只是has
的缩写,所以通常所有的Moose函数都像use
一样将在执行package P1;
的脚本的编译期间执行。另请参阅"BEGIN, UNITCHECK, CHECK, INIT and END" in perlmod。
虽然我认为这不是最好的解决方案,但您可以将BEGIN { ... }
声明贴在package P1
块中。或者,您可以在主代码之前放置<uses-permission android:name="android.permission.RECORD_AUDIO"/>
(在它自己的块中最好,因此它有自己的范围)。
但是,首先要将该类放在同一个文件中,还有一些事情要说,例如,答案在In Perl, how do I put multiple class in a single .pm file。
答案 1 :(得分:5)
您正在尝试在执行对创建它的has
的调用之前使用该属性。
内联模块的一种相对简单的方法如下:
use feature qw(say);
use strict;
use warnings;
use FindBin qw( $RealBin );
use lib $RealBin;
BEGIN {
package P1;
use Moose;
has name => (is => 'rw', isa => 'Str');
$INC{"P1.pm"} = 1;
}
use P1;
my $obj = P1->new(name => 'John');
say "The name is: ", $obj->name;
请记住,它仍然不完全相同。例如,模块现在位于脚本中的三个pragma范围内。也许您应该使用App::FatPacker或类似代码。