我逐渐使用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;
我读过有关强制的内容,但据我所知,这不是我所追求的。
有可能吗?
由于
答案 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);
}