加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Moose – 检查变量是否为Moose数据类型

发布时间:2020-12-15 23:33:33 所属栏目:大数据 来源:网络整理
导读:我正在将遗留应用程序转换为使用Moose(和Catalyst),并提出以下问题. 如何确定用户输入的Moose数据类型? 在下面的粗略示例中,我提交了多个查询,并使用下面非常基本的“验证”方法,根据预期的表单字段“id”,“name”和“email”验证数据. use MooseX::Declar
我正在将遗留应用程序转换为使用Moose(和Catalyst),并提出以下问题.

如何确定用户输入的Moose数据类型?

在下面的粗略示例中,我提交了多个查询,并使用下面非常基本的“验证”方法,根据预期的表单字段“id”,“name”和“email”验证数据.

use MooseX::Declare;
class CheckFields
{
    #has '_field' => ( is => 'rw',isa => 'Any' );

    # Fields on form and type to which they must match.
    method fields()
    {
        return [ { name => 'id',type => 'Int' },{ name => 'name',type => 'Str' },{ name => 'email',type => 'Email' }
               ];
    }

    # Dummy form posted requests.
    method queries()
    {
        return [ { 'id'    => 1,'name'  => 'John Doe','email' => 'john@doe.net'
                 },{ 'id'    => 'John Doe','name'  => 1,'email' => 'john.at.doe.net'
                 }
               ];
    }

    method validate_fields()
    {
        my $fields = $self->fields();

        # Loop through dummy form post requests
        foreach my $query ( @{ $self->queries } )
        {
            # Validate each field in posted form.
            foreach my $field ( @{ $fields } )
            {
                my $type = $field->{'type'};
                my $name = $field->{'name'};

                my $res = $self->validate->{ $type }( $query->{ $name} );
                print "$name is $resn";
            }
            print "n";
        }
    }

    # Very basic,slightly crude field validation.
    method validate()
    {
        return { 'Int'   => sub { my $val = shift; return $val =~ /^d+$/ ? "ok" : "not ok" },'Str'   => sub { my $val = shift; return $val =~ /^[a-zA-Zs]+$/ ?"ok" : "not ok"  },'Email' => sub { my $val = shift; return $val =~ /^(.+)@(.+)$/ ?"ok" : "not ok"  }
               };
    }
}

要测试此代码,只需运行…

#!/usr/bin/perl
use Moose;
use CheckFields;

CheckFields->new()->validate_fields();

1;

是否有可能做这样的事情,你设置一个isa设置为’Any’的变量…

has '_validate_field' => ( is => 'rw',isa => 'Any' );

…然后测试具体类型如下?

$self->validate_field(1);
print $self->validate_field->meta->isa('Int') ? 'Int found' : 'Int not found';

$self->validate_field('ABC');
print $self->validate_field->meta->isa('Int') ? 'Int found' : 'Int not found';

先感谢您

编辑:@bvr – 谢谢你花时间回复,我对Moose比较新,所以你使用MooseX :: Params :: Validate可能是最终的解决方案,虽然不是我想要的.我的目的是能够报告错误的每个特定字段,而不是整体报告验证失败.为此,我想我可以定义一个默认的,Moose友好的输入持有者,isa设置为’Any’.然后’eval'(或其他一些)来查看数据是否符合特定类型(Int,Str或我定义的某些自定义类型).

我试图通过“$self-> validate_field-> meta-> isa(‘Int’)……”参考是C/C++中的联合线,其中变量可以是不同类型的 – 在这种情况下,我只是试图测试数据是否符合某种数据类型.

解决方法

我不确定我是否完全按照你的问题的最后一部分,但你最初的例子可以从使用 MooseX::Params::Validate中受益.

编辑:我做了一些代码来评估我的建议.

use MooseX::Declare;
class CheckFields {

    use Moose::Util::TypeConstraints;
    use MooseX::Params::Validate;
    use Try::Tiny;
    use Data::Dump qw(pp);

    subtype 'Email' 
        => as 'Str' 
        => where {/^(.+)@(.+)$/};

    method fields() {
        return [
            id    => {isa => 'Int'},name  => {isa => 'Str'},email => {isa => 'Email'},];
    }

    method queries() {
        return [
            {   'id'    => 1,'email' => 'john@doe.net'
            },{   'id'    => 'John Doe','email' => 'john.at.doe.net'
            }
        ];
    }

    method validate_fields() {
        my $fields = $self->fields();

        foreach my $query (@{$self->queries}) {
            try {
                my (%params) = validated_hash([%$query],@{$fields});
                warn pp($query) . " - OKn";
            }
            catch {
                warn pp($query) . " - Failedn";
            }
        }
    }
}

package main;

CheckFields->new()->validate_fields();

我可以看到的其他方法是为数据创建一个Moose类(以这种方式验证)并检查是否可以创建实例而没有验证错误.像这样的东西:

use MooseX::Declare;
class Person {
    use Moose::Util::TypeConstraints;

    subtype 'Email'
        => as 'Str'
        => where {/^(.+)@(.+)$/};

    has id    => (is => 'ro',isa => 'Int');
    has name  => (is => 'ro',isa => 'Str');
    has email => (is => 'ro',isa => 'Email');
}

package main;

use Try::Tiny;
use Data::Dump qw(pp);

my @tests = (
    { id => 1,name => 'John Doe',email => 'john@doe.net'},{ id => 'John Doe',name => 1,email => 'john.at.doe.net'},);

for my $query (@tests) {
    try {
        my $person = Person->new(%$query);
        warn pp($query) . " - OKn";
    }
    catch {
        warn pp($query) . " - Failedn";
    };
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读