sub mysub { my ($self,$int) = @_; assert_int($int,'int[1]');}@H_403_12@子程序参数是要断言的数据&此数据的可选名称.这样我们就会收到更有用的错误消息,例如
Assertion error! 'int[1]' is not an integer; got 'HASH(0xXXXXXXXXX)'@H_403_12@用纯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@H_403_12@解决方法 如果你想要什么鼠标使用,没有什么能阻止你.my $int_constraint = Mouse::Util::TypeConstraints::find_type_constraint('Int');sub mysub { my ($self,$int) = @_; $int_constraint->assert_valID($int); ...}@H_403_12@如果您想提供自己的消息,请使用check或dIE而不是assert_valID.
我已经将它与Moose一起使用,但看起来它也适用于鼠标.
总结以上是内存溢出为你收集整理的用于数据类型检查的Perl框架全部内容,希望文章能够帮你解决用于数据类型检查的Perl框架所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
![微信扫一扫](/view/img/theme/weipay.png)
![支付宝扫一扫](/view/img/theme/alipay.png)
构建一个perl模块
上一篇
2022-06-06
跟踪Perl中的非确定性MySQL错误
下一篇
2022-06-06
评论列表(0条)