2

我还是 Perl 的新手,所以请原谅我。我认为这将是一项简单的任务,但由于某种原因,我无法得到我想要的结果。如果我有一个名为ParamRepeat等于 4 的变量和一个名为Paramscontains[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]]

4

3 回答 3

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"

括号 at(@param) x ...不是可选的,否则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 循环,for保持列表后的括号;在这种情况下,范围从1$ParamRepeat。在 Perl 中,关键字forforeach没有实际的区别。

X for 1 .. $n;

可以读“<code>$n 次,做X”。

于 2013-07-12T22:29:22.007 回答
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;
于 2013-07-13T15:48:08.497 回答
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";
于 2013-07-12T22:29:25.030 回答