6

我正在逐渐对一些代码进行 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;

我读过关于强制的文章,但据我所知,这不是我所追求的。

可能吗?

谢谢

4

3 回答 3

11

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

use List::MoreUtils qw/ zip /;

my $object = My::Record->new(
  zip @field_names,
      @{[ split /\|/, get_line_from_file ]}
);
于 2010-01-11T03:06:54.593 回答
7

我认为您使用哈希切片方法走在正确的轨道上。我会做类似的事情:

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

您可能会想出一个粗糙的map解决方案来实现相同的目标,但我会在可读性方面犯错。

于 2010-01-11T01:13:54.320 回答
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);
}
于 2010-01-11T01:54:05.923 回答