Perl Moose 属性句柄设置方法

Posted

技术标签:

【中文标题】Perl Moose 属性句柄设置方法【英文标题】:Perl Moose attribute handles set method 【发布时间】:2022-01-14 18:37:12 【问题描述】:

在'options'示例的行中定义了一个HashRef属性。

     has 'clsHsh' => (
            traits => ['Hash'],
            is    => 'rw',
            isa   => 'HashRef[Str]',
            default => sub ,
            handles => 
             set_clsHsh => 'set',
             get_clsHsh => 'get',
             has_no_clsHsh => 'is_empty',
             num_clsHsh   => 'count',
             delete_clsHsh => 'delete',
             clsHash_pairs => 'kv',
             ,
             );
    
    sub parseCls2()
         
             my ($self,$line) = @_;
            #input $line format is as follows
            #$line = qq<Class att1=val1 att2=val3.../>)
            #gather all key value pairs sans <Class
            $line =~ s/<Class(.*)\/>/$1/g;
            # split on space and take the resulting array
            # split that on =. Simply equating to hash will convert
            # key1,val1,key2,val2... to hash of key and value.
            my %l4_sh = map split /=/ split / /,$line;
            $self->clsHsh = \%l4_sh;
            return $self->clsHsh;
         
# 
# example of parsing a line
#
my $line = qq(<Class Cls="Bid" description="bid" low="" high=""/>)
;
my $h = $parser->parseCls2($line);
my %h1 = %$h;
while (my ($k,$v) = each %h1) 
  say "key = $k and value = $v"

我能够使用解析 $line 输入参数并将解析值存储在哈希中的子来填充 clsHsh 属性。 我的问题,

    有没有办法重新利用 set_clsHsh 而不是使用 sub? 推荐的方式是什么?

【问题讨论】:

“重新利用 set_clsHsh” “重新利用”是什么意思? 我使用 sub parse($line) 来填充 clsHsh。我可以改用 set_ClsHsh 吗?如果有,怎么做? 请编辑您的问题。添加一个完整的可运行示例。你的parse()如何访问clsHash? set_clsHsh 的唯一目的是设置此哈希中的元素:$obj-&gt;set_clsHsh($key,$val) 【参考方案1】:

@clamp - 感谢您的提示。我修改了 Parse.pm 文件中的 sub,它现在可以工作了。

has 'clsHsh' => (
            traits => ['Hash'],
            is    => 'rw',
            isa   => 'HashRef[Str]',
            default => sub ,
            handles => 
             set_clsHsh => 'set',
             get_clsHsh => 'get',
             has_no_clsHsh => 'is_empty',
             num_clsHsh   => 'count',
             delete_clsHsh => 'delete',
             clsHash_pairs => 'kv',
             ,
             );
    
    sub parseCls2()
         
            my ($self,$line) = @_;
            #input $line format is as follows
            #$line = qq<Class att1=val1 att2=val3.../>)
            #gather all key value pairs sans <Class
            $line =~ s/<Class(.*)\/>/$1/g;
            # split on space and take the resulting array
            # split that on =. Simply equating to hash will convert
            # key1,val1,key2,val2... to hash of key and value.
            $self->set_clsHsh(map split /=/ split / /,$line);

         

现在,我获取 clsHsh 的访问方法 (parse_test.pl) 变得更简单了。

my $line = qq(<Class Cls="Bid" description="bid" low="low" high="high"/>)
;
$parser->parseCls2($line);
my $k1 = "low";
say $parser->get_clsHsh($k1);

【讨论】:

以上是关于Perl Moose 属性句柄设置方法的主要内容,如果未能解决你的问题,请参考以下文章

Perl:在 Moose 类中添加编写器拒绝属性访问

使用 Perl/Moose,修饰符返回的值会发生啥变化?

你如何在 Perl 中创建对象?

Moose:角色中的共享属性

关于perl中文件操作句柄使用的几种方式-基础版

为啥 Moose 代码这么慢?