在Perl中为自己附加一个列表

时间:2013-07-12 22:20:21

标签: perl list reference

我还是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]]

3 个答案:

答案 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中,关键字forforeach没有实际差异。

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";