2010-01-11 75 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