我还是Perl的新手,请原谅我。我认为这将是一项简单的任务,但由于某种原因,我无法得到我想要的结果。如果我有一个名为ParamRepeat
的变量等于4,而一个名为Params
的数组包含[A,B]
,我将如何得到[A,B,A,B,A,B,A,B]
?
我尝试了很多东西,包括:
my @paParam;
for (my $i = 0; $i < $ParamRepeat; $i++)
{
my @Params = $self->{mpaParam};
push (@paParam,@Params);
}
return @paParam
但输出为[[A,B],[0],[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 ...
处的parens 不可选,否则x
执行字符串重复,在标量上下文中计算@param
,给出长度(结果) :2222
)。
代码中的问题是$self->{mpaParam}
包含数组引用,而不是数组。将其分配给数组会生成一个在第一个字段中保存数组引用的数组。您需要取消引用 arrayref:
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-loop,for
之后的parens持有一个列表;在这种情况下,范围从1
到$ParamRepeat
。在Perl中,关键字for
和foreach
没有实际差异。
在
X for 1 .. $n;
可以阅读“$n
次,执行X
”。
答案 1 :(得分: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;
答案 2 :(得分:1)
以下是数组的示例。
#!/bin/perl
use strict;
use warnings;
my @Params = ('A', 'B');
my $ParamRepeat = 4;
my @paParam;
for (my $i = 0; $i < $ParamRepeat; $i++) {
push @paParam, @Params;
}
print "@paParam\n";