在Perl中,如何将多个类放在一个.pm文件中

在Perl中,如何将多个类放在一个.pm文件中,perl,moose,Perl,Moose,我有一个关于Perl的问题。我想把多个类放在一个.pm文件中。如何创建此文件,以及文件名是什么,因为该.pm文件有多个类 比如说 use MooseX::Declare; class Point { has 'x' => ( isa => 'Num', is => 'rw' ); has 'y' => ( isa => 'Num', is => 'rw' ); method clear { $self->x(0);

我有一个关于Perl的问题。我想把多个类放在一个.pm文件中。如何创建此文件,以及文件名是什么,因为该.pm文件有多个类

比如说

use MooseX::Declare;
class Point {

   has 'x' => ( isa => 'Num', is => 'rw' );
   has 'y' => ( isa => 'Num', is => 'rw' );

   method clear {
      $self->x(0);
      $self->y(0);
   }
   method set_to( Num $x, Num $y) {
      $self->x($x);
      $self->y($y);
   }
}


class Point3D {

   has 'z' => ( isa => 'Num', is => 'rw' );

   method clear {
      $self->z(0);
   }
   method set_to( Num $x, Num $y, Num $z) {
      $self->x($x);
      $self->y($y);
      $self->z($z);
   }
}

如何保存此pm文件?按第一个类名还是第二个类名?

由于“每类一个文件”准则仅用于帮助您组织自己的代码,因此您可以根据需要命名文件

这就是说,有一个很好的理由证明该指南的存在。

有一个关于这个话题的有趣的讨论,你可能想回顾一下

我建议不要对每个文件使用多个类,除非您将它们放在一个公共名称空间中

{
包装几何;
类点{
...
}
类Point3D{
...
}
}
如果您选择该路径,您可以相应地命名
.pm
文件(即
Geometrics.pm

如果不能做到这一点,那么假设你的类是按主题关联的(就像它们看起来的那样),也许像
Points.pm
这样的东西是合适的

编辑

至于如何“从外部调用或使用类(Point,Point3D)”或如何实例化模块中定义的类:

#导入包
使用几何qw(点3D);
#或
#使用几何体(“点”“点3D”);
#实例化一个点
我的$point=point->new();
#实例化Point3D
我的$point3d=point3d->new();
您还可以通过执行以下操作之一导入包:

#导入软件包,但不要从中导入任何符号
使用Geometrics();

#虽然您可以通过这种方式导入包,但请不要这样做。
#导入包含所有符号的包
使用几何;
但是这样做会有一些警告

#导入不带符号的包
使用Geometrics();
#意味着对象的实例化必须是完全限定的
my$point=Geometrics::point->new();
my$point3d=Geometrics::point3d->new();
#导入包含所有符号的包
使用几何;
#使对象的实例化更简单
我的$point=point->new();
我的$point3d=point3d->new();
#但由于所有符号都是随包导入的,
#符号的覆盖太容易发生。
#如果我以这种方式导入包Foo(定义了符号栏)
使用Foo;
#然后以这种方式导入包Baz(它还定义了符号栏)
使用Baz;
#我再也不能访问Foo:Bar了,因为Baz::Bar已经写过了
#因为默认情况下我导入了带有所有符号的包。
#这里的教训是防御性编码和:
#仅导入您打算使用的符号,或
#不要导入任何符号并完全限定所有内容。

一般来说,不要将多个类放在一个文件中


我最常看到的例外是相关类,尤其是帮助类或顶级类的子类。在这些情况下,它们总是被分组到一个包中,文件名就是包名。

小写名称是用于pragmas的。亲爱的pete,感谢您的回复。但如何从外部或其他perl代码调用或使用类(Point,Point3D),如何为类创建对象。