【问题标题】:Perl Moose attribute handles set methodPerl Moose 属性句柄设置方法
【发布时间】: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 属性。 我的问题,

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

【问题讨论】:

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

标签: perl moose


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多