用格式化打印嵌套列表

问题描述:

我正在尝试编写一个Perl函数,它接受两个列表/数组并计算它们的交叉乘积(笛卡尔乘积)。我目前有代码工作,需要两个输入列表并计算交叉产品,但我无法打印嵌套的列表。用格式化打印嵌套列表

我正在寻找关于最佳打印嵌套列表的建议。这是我的作品目前的尝试:

for(@C) { 
    for(@$_) { 
     print $_; 
    } 
    print " "; 
} 

# prints 
# 1A 1B 1C 1D 1E 1F 1G 1H 1I 
# 2A 2B 2C 2D 2E 2F 2G 2H 2I 
# 3A 3B 3C 3D 3E 3F 3G 3H 3I 
# 4A 4B 4C 4D 4E 4F 4G 4H 4I 
# etc ... 

但这并没有看佩尔利对我来说足够。所以,我再次试图与map

print map { 
    map { $_ } @$_; 
} @C; 

# prints 
# 1A1B1C1D1E1F1G1H1I 
# 2A2B2C2D2E2F2G2H2I 
# 3A3B3C3D3E3F3G3H3I 
# 4A4B4C4D4E4F4G4H4I 
# etc ... 

但项目都压在一起。无论如何用map来格式化这种方法?有更好的方法来完成这个吗?

全功能代码:

use strict; 
use warnings; 

# globals 
my @digits = (1,2,3,4,5,6,7,8,9); 
my @letters = ("A","B","C","D","E","F","G","H","I"); 
my @rows = @digits; 
my @cols = @letters; 
my @squares = cross(\@rows, \@cols); 

sub cross { 
    my @C = []; 

    foreach (reverse @_) { 
     my @A = @$_; 

     @C = map { my $n = $_; map { [ $n, @$_ ] } @C } @A; 
    } 

    # works 
    #for(@C) { 
    # for(@$_) { 
    #  print $_; 
    # } 
    # print " "; 
    #} 

    print map { 
     map { $_ } @$_; 
    } @C; 

    return @C; 
} 
+0

为什么'地图{$ _} @ $ _'?这与“@ $ _”有什么不同? – Flimzy

+0

@Flimzy'@ $ _'是一个数组引用,我想查看各个元素。 –

+0

为什么downvote这个问题? –

print map { join '', @$_, ' ' } @C; 
+0

这正是我所期待的。谢谢! –

有没什么可说的map不能返回格式的字符串:

print map { " $_" }; 

或者为了控制更加精确,使用加入:

print join ' ', map { ... }; 

默认情况下,数组会插入到字符串中,因为您希望它们在这里。所以:

#! /usr/bin/env perl 
use common::sense; 

my @a = ([qw/1A 1B 1C 1D 1E 1F 1G 1H 1I/], 
     [qw/2A 2B 2C 2D 2E 2F 2G 2H 2I/], 
     [qw/3A 3B 3C 3D 3E 3F 3G 3H 3I/], 
     [qw/4A 4B 4C 4D 4E 4F 4G 4H 4I/], 
     ['etc', '...']); 

say "# prints"; 
say "# @$_" for @a; 

输出:

# prints 
# 1A 1B 1C 1D 1E 1F 1G 1H 1I 
# 2A 2B 2C 2D 2E 2F 2G 2H 2I 
# 3A 3B 3C 3D 3E 3F 3G 3H 3I 
# 4A 4B 4C 4D 4E 4F 4G 4H 4I 
# etc ... 

另外,

local $" = ', '; 
say "# @$_" for @a; 

输出:

# 1A, 1B, 1C, 1D, 1E, 1F, 1G, 1H, 1I 
# 2A, 2B, 2C, 2D, 2E, 2F, 2G, 2H, 2I 
# 3A, 3B, 3C, 3D, 3E, 3F, 3G, 3H, 3I 
# 4A, 4B, 4C, 4D, 4E, 4F, 4G, 4H, 4I 
# etc, ... 
+0

感谢您的支持。我并没有对字符串进行硬编码,但是我正在使用'(1,2,3,4,5,6,7,8,9)'和'(A,B,C,D,E,F,G, H,I)'并计算笛卡尔乘积以得到所有其他字符串。 –

+0

你能解释一下你分配给'@ a'的第一块代码是做什么的吗? –

+0

@HunterMcMillen,'([qw/a b c /],[qw/1 2 3 /])'是一个arrayrefs列表。它相当于'(['a','b','c'],[1,2,3])',这个对@a的赋值相当于:'my @a; $ a [0] [0] ='a'; $ a [0] [1] ='b'; ...; $ a [1] [2] = 3;' –