2014-05-07 58 views
0

我創建一個用戶模塊來提取用戶信息,目前我有:發送參數多個子例程在Perl模塊

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

我認爲您的通用代碼架構存在一些問題,但截至目前爲止沒有提供足夠的上下文來建議替代解決方案 - 考慮在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, ...); 
+0

你是正確的。我返工,並用一個子程序完成所有工作的完成在這裏:http://codepen.io/anon/pen/EGbLd –

2

難道我理解正確的話,你要避免以下行的$id重複?

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

$self是標量,所以你應該只是使用匿名數組[...]。要指定$id只有一次,你可以使用

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