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

Spa*_*les 6 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]);
...
Run Code Online (Sandbox Code Playgroud)

但我希望快速一个班轮一次性分配所有属性,有点类似于:

my $line = get_line_from_file;
my %records;
@records{@field_names} = split /\|/, $line;
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

谢谢

Gre*_*con 11

Pass the attributes to the constructor using zip from the List::MoreUtils module:

use List::MoreUtils qw/ zip /;

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


fri*_*edo 7

我认为你采用哈希切片方法是正确的.我会这样做:

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

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

  • 如果其中两个属性是数组(文件中以分号分隔),那么是否可以使用强制? (2认同)
  • 是的,您可以在该实例中使用强制.你会使用像`sub {return [split /; /,$ _ [0]}这样的强制函数将`Str`强制转换为`Array`. (2认同)