如何使用与主脚本相同的文件中定义的Moose类?

时间:2018-04-04 14:32:54

标签: perl moose

以下脚本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');

2 个答案:

答案 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或类似代码。