Perl 打印带格式的嵌套列表
我正在尝试编写一个Perl函数,它接受两个列表/数组并计算它们的叉积(笛卡尔积)。我目前有一个代码工作,它接受两个输入列表并计算叉积,但打印嵌套列表时遇到问题 我正在寻找关于打印嵌套列表的最佳方法的建议。以下是我目前的有效尝试:Perl 打印带格式的嵌套列表,perl,Perl,我正在尝试编写一个Perl函数,它接受两个列表/数组并计算它们的叉积(笛卡尔积)。我目前有一个代码工作,它接受两个输入列表并计算叉积,但打印嵌套列表时遇到问题 我正在寻找关于打印嵌套列表的最佳方法的建议。以下是我目前的有效尝试: for(@C) { for(@$_) { print $_; } print " "; } # prints # 1A 1B 1C 1D 1E 1F 1G 1H 1I # 2A 2B 2C 2D 2E 2F 2G 2H
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;
}
没有任何说明
map
无法返回格式化字符串:
print map { " $_" };
或要进行更精确的控制,请使用“连接”:
print join ' ', map { ... };
没有任何说明
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 ...
# 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;
产出:
# 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 ...
# 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, ...
默认情况下,数组会按您的需要插入字符串。因此:
#! /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 ...
# 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;
产出:
# 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 ...
# 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, ...
为什么
映射{$\}@$\
?这与仅仅@$
有什么不同?@Flimzy@$
是一个数组引用,我想查看单个元素。为什么对这个问题投反对票?@
反引用$
中的arrayref<代码>映射{$\u}除了不必要地迭代这些元素中的每一个,返回每一个元素之外,什么都不做。@Flimzy-hmm好的,我对Perl还是很陌生,所以我不确定每一个元素都做些什么。谢谢你为我澄清这一点。为什么map{$\u}@$\ ucode>?这与仅仅@$
有什么不同?@Flimzy@$
是一个数组引用,我想查看单个元素。为什么对这个问题投反对票?@
反引用$
中的arrayref<代码>映射{$\u}
除了不必要地迭代这些元素中的每一个,返回每一个元素之外,什么都不做。@Flimzy-hmm好的,我对Perl还是很陌生,所以我不确定每一个元素都做些什么。谢谢你为我澄清这一点。这正是我想要的。谢谢这正是我想要的。谢谢谢谢你。然而,我并没有硬编码这些字符串,而是用(1,2,3,4,5,6,7,8,9)
和(A,B,C,D,E,F,G,H,I)
计算笛卡尔积来得到所有其他字符串。你能解释一下你分配给@A
的第一块代码是什么吗?@HunterMcMillen,([qw/abc/],[qw/1233/])
是阵列引用的列表。它相当于(['a','b','c'],[1,2,3])
,将其分配给@a相当于:my@a$a[0][0]=“a”$a[0][1]=“b”$a[1][2]=3代码>谢谢。然而,我并没有硬编码这些字符串,而是用(1,2,3,4,5,6,7,8,9)
和(A,B,C,D,E,F,G,H,I)
计算笛卡尔积来得到所有其他字符串。你能解释一下你分配给@A
的第一块代码是什么吗?@HunterMcMillen,([qw/abc/],[qw/1233/])
是阵列引用的列表。它相当于(['a','b','c'],[1,2,3])
,将其分配给@a相当于:my@a$a[0][0]=“a”$a[0][1]=“b”$a[1][2]=3代码>