perl 更正语法以避免临时变量

zu0ti5jz  于 2023-08-06  发布在  Perl
关注(0)|答案(1)|浏览(141)

编写一些代码,我有一个名为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";

e5nqia27

e5nqia271#

这里只允许一个简单的标量,所以你要么使用hack

$self->${\( $_->[0] )}()

字符串
或者另一种方法

$self->can( $_->[0] )->( $self )

相关问题