6

私は、パイプ区切りから行を読み取り、それぞれを分割し、ハッシュスライスを使用してそれらをハッシュに追加するコードを徐々に Moose 化しています。

ハッシュを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から使用して、属性をコンストラクターに渡します。List::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 に答える