【问题标题】:how to factorize two lists如何分解两个列表
【发布时间】:2018-01-22 15:43:07
【问题描述】:

有没有办法在 perl 中轻松分解一些列表?

例如有 2 个列表 ('a', 'b', 'c')('d', 'e', 'f') 我想要输出('ad', 'ae', 'af' .... 'ce', 'cf')

现在我在做

use strict;
use warnings;

my @listA = ('a', 'b', 'c');
my @listB = ('d', 'e', 'f');
my @listC = ();

foreach my $elementA (@listA)
{
    foreach my $elementB (@listB)
    {
        push(@listC, $elementA.$elementB);
    }
}

这很好用,但我想知道是否有更“perlish”的方式来做到这一点?

谢谢:)

【问题讨论】:

    标签: perl factorization


    【解决方案1】:

    您可以使用map 使其更Perlish

    my @list_a = qw( a b c );
    my @list_b = qw( d e f );
    my @list_c = map {
        my $temporary = $_;
        map { $temporary . $_ } @list_b
    } @list_a;
    

    这会产生与上面相同的@list_c

    我们需要$temporary 变量,因为maps 都会设置主题$_,而内部map 会覆盖外部主题,因此我们必须将其保存在另一个词法中。

    请注意,我重命名了您的变量并使用了qw(),因为您要求的是 Perlish。 Perl 中关于样式的共同共识是使用蛇形变量名称。尽管骆驼案例是以我们的骆驼命名的,但我们不会将它用于变量。仅适用于包名称。

    【讨论】:

      【解决方案2】:

      任意数量列表的解决方案:

      use Algorithm::Loops qw( NestedLoops );
      
      my @arrays = (
         [qw( a b c )],
         [qw( d e f )],
         ...
      );
      
      my @result;
      NestedLoops(\@arrays, sub { push @result, join("", @_); });
      

      my @result;
      my $iter = NestedLoops(\@arrays);
      while (my @comb = $iter->()) {
         push @result, join("", @comb);
      }
      

      【讨论】:

        【解决方案3】:
        @listC = glob join '', map '{' . join(',', map quotemeta, @$_) . '}', \@listA, \@listB;
        

        【讨论】:

        • @$_ 应该是 map quotemeta, @$_ 来处理特殊字符,但其他方面很好。它甚至可以处理任意数量的列表。
        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-06-16
          • 2023-01-27
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 1970-01-01
          • 2018-11-05
          • 1970-01-01
          相关资源
          最近更新 更多