将参数发送到Perl模块中的多个子例程

时间:2014-05-07 21:39:35

标签: perl oop parameters perl-module subroutine

我正在创建一个用户模块来提取用户信息,目前我有:

sub new
{
    my $class = shift;
    my ( $id ) = @_;
    my $self = getUserInfo ($id);
    bless $self, $class;
    return $self;
}

sub getUserInfo
{
    ...
}

但是,我希望达到以下效果:

my $self = (getFirstName($id), getLastName($id), getEmpNum($id));

...

sub getFirstName{ return { firstname => $firstname }; }
sub getLastName{ return { lastname => $lastname }; }
sub getEmpNum{ return { empnum => $empnum }; }

如何将参数分配给多个子程序?

2 个答案:

答案 0 :(得分:2)

我认为您的通用代码架构存在一些问题,但到目前为止,这些代码段并没有提供足够的背景来建议替代解决方案 - 考虑在Code Review上发布完整的代码以获得更完整的批评。

关于你的直接问题:你可以编写一个函数来组合哈希引用:

use Carp ();

sub combine_hashrefs {
    my %combined;
    for my $hashref (@_) {
        if (my @conflicts = grep { exists $combined{$_} } keys %$hashref) {
            Carp::confess "The keys [@conflicts] are conflicting";
        }
        @combined{keys %$hashref} = values %$hashref;
    }
    return \%combined;
}

...

my $self = combine_hashrefs($hashref_a, $hashref_b, $hashref_c, ...);

答案 1 :(得分:2)

我是否理解您要避免在以下行中重复$id

my $self = (getFirstName($id), getLastName($id), getEmpNum($id));

$self是标量,因此您应该使用匿名数组[...]。要仅指定$id一次,您可以使用

my $self = [ map $_->($id), \&getFirstName, \&getLastName, \&getEmpNum ];