【问题标题】:Append a list to itself in Perl在 Perl 中将列表附加到自身
【发布时间】:2013-07-12 22:20:20
【问题描述】:

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

【问题讨论】:

    标签: perl list reference


    【解决方案1】:

    您似乎还不知道重复运算符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-&gt;{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 中,关键字 for 和 foreach 没有实际区别。

    X for 1 .. $n;
    

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

    【讨论】:

      【解决方案2】:

      $self-&gt;{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;
      

      【讨论】:

        【解决方案3】:

        这是一个数组示例。

        #!/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";
        

        【讨论】:

          猜你喜欢
          • 2011-10-11
          • 2020-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-24
          • 2014-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多