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

用于数据类型检查的Perl框架

发布时间:2020-12-16 06:14:58 所属栏目:大数据 来源:网络整理
导读:所以我想给我的其他子程序带一点鼠标速度,然后做一些类型检查 sub mysub { my ($self,$int) = @_; assert_int($int,'int[1]');} 子程序参数是要断言的数据此数据的可选名称.这样我们就会收到更有用的错误消息,例如 Assertion error! 'int[1]' is not an inte
所以我想给我的其他子程序带一点鼠标速度,然后做一些类型检查

sub mysub {
    my ($self,$int) = @_;
    assert_int($int,'int[1]');
}

子程序参数是要断言的数据&此数据的可选名称.这样我们就会收到更有用的错误消息,例如

Assertion error! 'int[1]' is not an integer; got 'HASH(0xXXXXXXXXX)'

用纯Perl编写它并不难.将它与Mouse&中的速度进行比较时gfx的另一个模块Data :: Util,比纯Perl快4倍,很明显纯XS解决方案具有优势,但缺少这个可选参数名称.在Data :: Util的检查函数周围编写一个小包装器仍然比直接使用XS慢.

有没有人知道一套快速数据类型断言实用程序,它允许将此字段名称传递给断言?

在@ikegami回答有关如何使用鼠标类型系统后编辑,似乎与仅使用XS库相比,性能仍然缺乏.所以这个问题变得更加有问题是否存在一个基于XS的框架,它可以提供可自定义的错误消息,或者至少可以让你说出属性被调用的内容.

编辑这是我目前正在比较性能的代码.这主要基于gfx在Data :: Util和Mouse的XS模式上的工作.这使我们在纯Perl解决方案上的速度提高了5倍.将C与Perl进行比较有点不公平,这就是为什么我想知道一个框架是否已经存在,它可以提供这种性能但是有正确的错误信息.如果其他人已经做过,我不想写这些东西:)

use Inline C => <<'END_C';

static int S_nv_is_integer(pTHX_ NV const nv) {
  if(nv == (NV)(IV)nv){
    return TRUE;
  }
  else {
    char buf[64];  /* Must fit sprintf/Gconvert of longest NV */
    const char* p;
    (void)Gconvert(nv,NV_DIG,buf);
    p = &buf[0];

    /* -?[0-9]+ */
    if(*p == '-') p++;

    while(*p){
        if(!isDIGIT(*p)){
            return FALSE;
        }
        p++;
    }
    return TRUE;
  }
}

int assert_int(SV* sv,char* attributeName) {
  assert(sv);
  int result;
  if(SvPOKp(sv)){
    int const num_type = grok_number(SvPVX(sv),SvCUR(sv),NULL);
    result = num_type && !(num_type & IS_NUMBER_NOT_INT);
  }
  else if(SvIOKp(sv)){
    result = TRUE;
  }
  else if(SvNOKp(sv)) {
    result = S_nv_is_integer(aTHX_ SvNVX(sv));
  }
  else {
    result = FALSE;
  }

  if(! result) {
    croak("'%s' was not an integer; got '%s'",attributeName,SvPV(sv,PL_na));
  }
  return result;
}

END_C

解决方法

如果你想要什么鼠标使用,没有什么能阻止你.

my $int_constraint = Mouse::Util::TypeConstraints::find_type_constraint('Int');

sub mysub {
    my ($self,$int) = @_;
    $int_constraint->assert_valid($int);
    ...
}

如果您想提供自己的消息,请使用check或die而不是assert_valid.

我已经将它与Moose一起使用,但看起来它也适用于鼠标.

(编辑:李大同)

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

    推荐文章
      热点阅读