编写一些代码,我有一个名为FLAGS
的列表,其中每个元素都是一个数组引用,其中第一个元素是一个方法名,用于设置布尔标志(getter/setter组合)。在准备“JSONize”对象时,我想省略未设置的标志(getter方法将返回false)。
过滤标志名称的部分代码是($self->$n()
调用对象$self
上的名称为$n
的方法):
[grep { my $n = $_->[0]; $self->$n() } FLAGS]
字符串
(对不起,原始代码非常复杂,所以我无法提供完整的示例)
我试过了,但找不到语法来避免临时变量$n
(错误消息类似于“Can 't locate object method“ARRAY(0x 1c 47418)”via package...”)。
这样的语法是否存在,如果存在,它看起来是什么样子?
更新
虽然我认为答案可以通过现有的信息提供,但我做了一些非常相似的最小工作示例:
#!/usr/bin/perl
use strict;
use warnings;
package MWE;
use constant FLAGS => (
['is_authentic', 1],
['is_disabled', 2],
['is_fault', 3],
#...
); # flag list
sub new($;$)
{
my ($class, $flags) = @_;
my $self = \$flags;
bless $self, $class;
return $self;
}
# value of a bit
sub _bit_value($)
{
use integer;
return (1 << $_[0]);
}
# test a bit
sub _bit_test($$)
{
my ($val, $bit) = @_;
return $val & _bit_value($bit);
}
sub is_authentic($) { return _bit_test(${$_[0]}, 1) != 0 }
sub is_disabled($) { return _bit_test(${$_[0]}, 2) != 0 }
sub is_fault($) { return _bit_test(${$_[0]}, 3) != 0 }
sub flags($)
{
my $self = $_[0];
#return FLAGS;
return grep { my $n = $_->[0]; $self->$n() } FLAGS;
}
1;
package main;
my $f = MWE->new(2);
print "flags: ", join('|', map { $_->[0] } $f->flags()), "\n";
型
1条答案
按热度按时间e5nqia271#
这里只允许一个简单的标量,所以你要么使用hack
字符串
或者另一种方法
型