2010-01-11 73 views
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; 

我已经读过关于强迫的内容,但是从我所能告诉的不是我所追求的是什么。

可能吗?

谢谢

回答

7

我认为你是在正确的轨道与散列切片方法。我会做这样的事情:

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

你也许可以想出一个粗糙map解决方案,实现同样的事情,但我会在这里可读性方面犯了错误。

+2

如果2个属性是数组(在文件中用分号分隔)是否可以使用胁迫? – Sparkles 2010-01-11 03:32:46

+2

是的,你可以在这种情况下使用强制。你可以使用'sub' {return [split /; /,$ _ [0]}' – friedo 2010-01-11 04:08:48

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); 
} 
11

传递的属性,以使用zipList::MoreUtils模块构造:

use List::MoreUtils qw/ zip /; 

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

+1强制函数'''''''''''''''强制'Str'到'Array',非常好。 – friedo 2010-01-11 07:01:30