如何使用Perl在后续订单中获取所有可能的相邻项组合?

Mik*_*ke 3 perl combinations

例如,我有一个数组

my @arr = qw(0 1 2 3 4);
Run Code Online (Sandbox Code Playgroud)

如何获得以下组合:

0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4
Run Code Online (Sandbox Code Playgroud)

如果有的话,这种组合(或排列)的名称是什么?

永远感谢!

Dav*_*oss 7

就个人而言,我发现gbacon使用的循环"C风格"通常会不必要地使代码复杂化.而且通常可以用更容易理解的"范围式"循环替换它.

#!/usr/bin/perl

use strict;
use warnings;

my @arr = qw(0 1 2 3 4);

my @result;
for my $i (0 .. $#arr) {
  for my $j ($i .. $#arr) {
    push @result => [ @arr[$i .. $j] ];
  }
}

print @$_, "\n" for @result;
Run Code Online (Sandbox Code Playgroud)


Gre*_*con 6

使用数组切片:

#! /usr/bin/perl

use warnings;
use strict;

my @arr = qw(0 1 2 3 4);

my @result;
for (my $i = 0; $i < @arr; $i++) {
  for (my $j = $i; $j < @arr; $j++) {
    push @result => [ @arr[$i .. $j] ];
  }
}

print @$_, "\n" for @result;
Run Code Online (Sandbox Code Playgroud)

输出:

0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4

  • @Mike在Perl 5中,胖逗号主要只是一个看上去很奇怪的逗号运算符(尽管它的左边是字符串化).在哈希构造函数之外的情况下使用它偶尔会使代码更具可读性.例如,[`Moose`](http://search.cpan.org/dist/Moose-1.12/lib/Moose.pm)的`有x =>(isa =>"Int",is =>" rw");`比`has"x","isa","Int","is","rw"更容易阅读;`; 但是,在这种情况下,我认为它使代码更难阅读.它使`@ result`看起来像是被推到了匿名的arrayref上. (3认同)
  • 在键/值对之外使用`=>`是一种人喜欢的风格.不过我发现它有点古怪. (2认同)