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

perl – 比较和验证数据结构

发布时间:2020-12-16 06:29:05 所属栏目:大数据 来源:网络整理
导读:我必须像这样检查hashrefs { foo = 65,bar = 20,baz = 15 } 对表达这样的条件的hashrefs的arrayref [ { foo = { "=" = 75 } },{ bar = { "==" = 20 } },{ baz = { "=" = 5 } },] 如果满足所有条件,则返回真值. 两个数据结构都没有预先确定.一个是通过解析数
我必须像这样检查hashrefs

{ foo => 65,bar => 20,baz => 15 }

对表达这样的条件的hashrefs的arrayref

[
 { foo => { "<=" => 75 } },{ bar => { "==" => 20 } },{ baz => { ">=" => 5 } },]

如果满足所有条件,则返回真值.

两个数据结构都没有预先确定.一个是通过解析数据库中的字符串而构建的,另一个是通过解析用户输入来构建的.

在上面的例子中,我会返回true,但如果我检查hashref

[
 { foo => { "<=" => 60 } },]

我会返回false,因为第一个hashref中的foo不是< = 60. 问题是:这样做的最佳策略是什么? 我在想
>通过eval构建一系列子参数
>检查5个不同的预建subrefs中的适当的一个(每个案例一个>,<,< =,> =和==)

我完全走错了路吗?如果没有,最好的,评估或预建的功能是什么?

我已经研究过Params :: Validate,但是我担心它会产生大量开销,而且无论如何我都必须构建回调.

解决方法

请改用代码引用,您就可以使用验证器.我简化了你的条件结构.除非你有重复的散列键,否则不需要在那里有额外的数组级别,我认为你没有.

简化的子{$_ [0]< = 75}将简单地比较参数的第一个值.默认情况下,子例程中计算的最后一个值将是其返回值.

use v5.10;
use strict;
use warnings;

my $in = { foo => 65,bar => 21,baz => 15 };

my $ref = {
    foo => sub { $_[0] <= 75 },bar => sub { $_[0] == 20 },baz => sub { $_[0] >= 5 },};

for my $key (keys %$in) {
    if ($ref->{$key}($in->{$key})) {
        say "$key : Valid";
    } else {
        say "$key : Invalid";
    }
}

输出:

bar : Invalid
baz : Valid
foo : Valid

(编辑:李大同)

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

    推荐文章
      热点阅读