10

我刚开始使用Moose

我正在创建一个简单的通知对象,并想检查输入是否属于“电子邮件”类型。(暂时忽略简单的正则表达式匹配)。

从文档中我认为它应该类似于以下代码:

# --- contents of message.pl --- #
package Message;
use Moose;

subtype 'Email' => as 'Str' => where { /.*@.*/ } ;

has 'subject' => ( isa => 'Str', is => 'rw',);
has 'to'      => ( isa => 'Email', is => 'rw',);

no Moose; 1;
#############################
package main;

my $msg = Message->new( 
    subject => 'Hello, World!', 
    to => 'coolkids@example.com' 
);  
print $msg->{to} . "\n";

但我收到以下错误:

在 message.pl 第 5 行,“subtype 'Email'”附近的操作员预期的位置找到字符串
    (你需要预先声明子类型吗?)
在 message.pl 第 5 行,“as 'Str'”附近的操作员预期的位置找到字符串
    (您需要预先声明为吗?)
message.pl 第 5 行的语法错误,靠近“子类型‘电子邮件’”
错误后 BEGIN 不安全——编译在 message.pl 第 10 行中止。

有人知道如何在 Moose 中创建自定义电子邮件子类型吗?

Moose 版本:0.72 perl 版本:5.10.0,平台:linux-ubuntu 8.10

4

2 回答 2

13

我也是 Moose 的新手,但我认为对于subtype,您需要添加

use Moose::Util::TypeConstraints;
于 2009-03-21T01:03:15.933 回答
10

这是我之前从食谱中偷来的一个:

package MyPackage;
use Moose;
use Email::Valid;
use Moose::Util::TypeConstraints;

subtype 'Email'
   => as 'Str'
   => where { Email::Valid->address($_) }
   => message { "$_ is not a valid email address" };

has 'email'        => (is =>'ro' , isa => 'Email', required => 1 );
于 2009-03-21T11:22:01.437 回答