在Perl中,如何在字符串中调用名称为的方法?
发布时间:2020-12-15 23:36:08 所属栏目:大数据 来源:网络整理
导读:我正在尝试编写一些抽象代码,用于搜索属性与特定值匹配的第一个类似对象的列表.为了做到这一点,我需要调用一堆访问器方法并逐个检查它们的所有值.我想使用这样的抽象: sub verify_attribute { my ($object,$attribute_method,$wanted_value) = @_; if ( cal
我正在尝试编写一些抽象代码,用于搜索属性与特定值匹配的第一个类似对象的列表.为了做到这一点,我需要调用一堆访问器方法并逐个检查它们的所有值.我想使用这样的抽象:
sub verify_attribute { my ($object,$attribute_method,$wanted_value) = @_; if ( call_method($object,$attribute_method) ~~ $wanted_value ) { return 1; } else { return; } } 然后我可以遍历一个哈希,哈希的密钥是访问者方法名称,其值是我正在为这些属性寻找的值.例如,如果该哈希名为%wanted,我可能会使用这样的代码来查找我想要的对象: my $found_object; FINDOBJ: foreach my $obj (@list_of_objects) { foreach my $accessor (keys %wanted) { next FINDOBJ unless verify_attribute($obj,$accessor,$wanted{$accessor}); } # All attrs verified $found_object = $obj; last FINDOBJ; } 当然,唯一的问题是call_method不存在.或者是吗?如果我有一个包含其名称的字符串,我该如何调用方法?或者对整个问题有更好的解决方案吗? 解决方法my $found_object; FINDOBJ: foreach my $obj (@list_of_objects) { foreach my $accessor (keys %wanted) { next FINDOBJ unless $obj->$accessor() == $wanted{$accessor}; } # All attrs verified $found_object = $obj; last; } 是的,您可以通过这种方式调用方法.不涉及字符串(或任何其他)eval. 或者,对于一些额外的学分,以功能方式执行:( all()应该真正成为List :: Util的一部分!) use List::Util 'first'; sub all (&@) { my $code = shift; $code->($_) || return 0 for @_; return 1; } my $match = first { my $obj = $_; all { $obj->$_ == $attrs{$_} } keys %wanted } @list_of_objects; 更新:不可否认,第一个解决方案是较少混淆的解决方案,所以最好.但是,当有人回答问题时,你也加了一点糖,让它对你自己也很有趣! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |