我有一个未知大小的数组SELECT CUST.CustomerID, CUST.Name, ORDR.OrderID, ORDR.OrderDate, ORDR.ProductInfo, COUNTS.cnt
FROM Customers CUST
INNER JOIN Orders ORDR
ON ORDR.CustomerID = CUST.CustomerID
INNER JOIN
(
SELECT C.CustomerID, COUNT(DISTINCT O.OrderID) AS cnt
FROM Customers C
INNER JOIN Orders O
ON O.CustomerID = C.CustomerID
GROUP BY C.CustomerID
) COUNTS
ON COUNTS.CustomerID = CUST.CustomerID
ORDER BY COUNTS.cnt DESC, CustomerID
。每个元素@ary
都是未知大小的arrayref。 的每个元素,$ary[$i]
都是一个字符串。
我希望将$ary[$i][$j]
与所有$ary[0][$j]
的所有内容连接起来......等等。
也就是说,假设我的数组看起来像这样:
$ary[1][$j]
然后我希望$ary[0] = ['foo', 'fun'];
$ary[1] = ['bar', 'bun', 'blip'];
$ary[2] = ['baz', 'zun'];
成为:
return
(或者,(
'foo bar baz',
'foo bar zun',
'foo bun baz',
'foo bun zun',
'foo blip baz',
'foo blip zun',
'fun bar baz',
'fun bar zun',
'fun bun baz',
'fun bun zun',
'fun blip baz',
'fun blip zun'
)
可以是arrayrefs数组:return
。)
我该怎么做?
答案 0 :(得分:3)
我建议从一系列索引开始,然后遍历所有组合:
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
my @array = (
[qw(foo fun)],
[qw(bar bun blip)],
[qw(baz zun)],
);
my @index = (0) x @array;
SET:
while (1) {
my @set = map { $array[$_][ $index[$_] ] } (0 .. $#index);
say "@set";
$index[-1]++;
for my $i (reverse 0 .. $#index) {
if ($index[$i] > $#{ $array[$i] }) {
$index[$i] = 0;
if ($i > 0) {
$index[$i - 1]++;
} else {
last SET;
}
}
}
}
结果:
foo bar baz
foo bar zun
foo bun baz
foo bun zun
foo blip baz
foo blip zun
fun bar baz
fun bar zun
fun bun baz
fun bun zun
fun blip baz
fun blip zun
有cpan模块可以做这种组合,但不能随时了解它们。
答案 1 :(得分:1)
我做到了这一点并且有效:
#!/usr/bin/perl
use strict;
use warnings;
my @arry= ();
$arry[0] = ['foo', 'fun'];
$arry[1] = ['bar', 'bun', 'blip'];
$arry[2] = ['baz', 'zun'];
my @combos = ();
$combos[0] = [''];
for my $i (1 .. @arry) {
for my $j (0 .. @{$combos[$i - 1]} - 1) {
push @{$combos[$i]}, "$combos[$i - 1][$j] $_" for @{$arry[$i - 1]};
}
}
my @goodcombos = @{$combos[-1]};
s/^ // for @goodcombos;
print "$_\n" for @goodcombos;
它构建了所需的连接,存储了$combos[1]
中的第一个术语,$combos[2]
中前两个术语的连接,$combos[3]
中前三个术语的连接,以及等等。