如何同时分配许多Moose属性?

时间:2010-01-11 01:00:54

标签: perl attributes moose

我逐渐使用Moose-ifying从管道分隔的行读取一些代码,拆分每个代码并使用哈希切片将它们添加到哈希中。

我已经将哈希变成了Moose类,但现在我不知道如何快速将文件中的字段分配给类的属性(如果有的话)。

我知道我可以很容易地做到:

my $line = get_line_from_file;
my @fields = split /\|/, $line;
my $record = My::Record->new;
$record->attr1($fields[0]);
...

但是我希望能快速分配所有属性,有点类似于:

my $line = get_line_from_file;
my %records;
@records{@field_names} = split /\|/, $line;

我读过有关强制的内容,但据我所知,这不是我所追求的。

有可能吗?

由于

3 个答案:

答案 0 :(得分:11)

使用zip模块中的List::MoreUtils将属性传递给构造函数:

use List::MoreUtils qw/ zip /;

my $object = My::Record->new(
  zip @field_names,
      @{[ split /\|/, get_line_from_file ]}
);

答案 1 :(得分:7)

我认为你采用哈希切片方法处于正确的轨道上。我会做类似的事情:

my %fields;
@fields{@field_names} = split m{\|}, $line;
my $record = My::Record->new( %fields );

你或许可以提出一个粗略的map解决方案来实现同样的目标,但我在这里的可读性方面是错误的。

答案 2 :(得分:3)

如果尚未构造对象,则只需将所有键和值传递给构造函数:

my $line = get_line_from_file;
my %records;
@records{@field_names} = split /\|/, $line;
my $object = My::Record->new(%records);

或者如果已经创建了对象并且您想要添加一些新字段:

my $line = get_line_from_file;
my %records;
@records{@field_names} = split /\|/, $line;
while (my ($key, $value) = each(%records)
{
    $object->$key($value);

    # or if you use different names for the setters than the "default":
    $object->set_value($key, $value);
}