2013-07-12 102 views
2

我還是Perl的新手,所以原諒我。我認爲這將是一件容易的事,但由於某種原因,我無法得到我想要的結果。如果我有一個名爲ParamRepeat的變量等於4,並且包含[A,B]的名爲Params的數組我將如何得到[A,B,A,B,A,B,A,B]在Perl中追加一個列表

我嘗試了很多事情,包括:

my @paParam; 
    for (my $i = 0; $i < $ParamRepeat; $i++) 
    { 
     my @Params = $self->{mpaParam}; 
     push (@paParam,@Params); 
    } 
    return @paParam 

但輸出[[A,B],[0],[0],[0]]

回答

3

你似乎不知道重複操作x尚未:

my @params = qw(A B); 
my $param_repeat = 4; 
@params = (@params) x $param_repeat; 
say "@params"; # "A B A B A B A B" 

(@param) x ...的括號是可選的,否則,該x確實串的重複,這在標量環境評估@param,給長度(結果:2222)。


問題在代碼是$self->{mpaParam}數組引用,不是陣列。將它分配給一個數組會導致一個數組在第一個字段中包含一個數組引用。您需要提領的數組引用:

my @Params = @{ $self->{mpaParam} }; 

@{ ... }是數組引用操作。然後,你的代碼工作爲好,但我會寫的循環簡單一點:

push @paParam, @{ $self->{mpaParam} } for 1 .. $ParamRepeat; 

請注意,我不使用中間@Params變量,而我使用的是foreach環路作爲語句修飾(即在聲明之後)。它相當於

for (1 .. $ParamRepeat) 
    push @paParam, @{ $self->{mpaParam} }; 
} 

這種類型的循環是一個foreach循環,而相比之下,C風格for (X;Y;Z) { ... }循環。對於foreach循環,for後面的parens包含一個列表;在這種情況下,範圍從1$ParamRepeat。在Perl中,關鍵字forforeach沒有實際差異。

X for 1 .. $n; 

可以讀「$n次,做X」。

2

$self->{mpaParam}包含對數組的引用。

my $Params = $self->{mpaParam}; 

你要引用數組的元素

@$Params 

所以

my $Params = $self->{mpaParam}; 
push @paParam, @$Params; 

push @paParam, @{ $self->{mpaParam} }; 

簡單:

my @paParam; 
my @Params = @{ $self->{mpaParam} }; # Do this once 
for (my $i = 0; $i < $ParamRepeat; $i++) { 
    push @paParam, @Params; 
} 
return @paParam; 

簡單:

my @paParam; 
my @Params = @{ $self->{mpaParam} }; 
for (1..$ParamRepeat) { # Simpler loop 
    push @paParam, @Params; 
} 
return @paParam; 

簡單:

my @Params = @{ $self->{mpaParam} }; 
return map { @Params } 1 .. $ParamRepeat; # Build a list directly 

簡單:

return (@{ $self->{mpaParam} }) x $ParamRepeat;