如何在perl中编写多维数组作为制表符分隔的.txt文件

如何在perl中编写多维数组作为制表符分隔的.txt文件,perl,multidimensional-array,tab-delimited,Perl,Multidimensional Array,Tab Delimited,我有一个叫做@main的多维数组 我想用perl将这个数组写入一个以制表符分隔的.txt文件 有人能帮我解决这个问题吗?这不是一个多维数组,它是由其他三个数组连接而成的数组 perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g); print join("\t",@h)."\n";' 如果您需要进一步的帮助,请提供所需的输出。这不是多维数组,而是通过连接其他三个数组形成的数组 perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g)

我有一个叫做@main的多维数组 我想用perl将这个数组写入一个以制表符分隔的.txt文件
有人能帮我解决这个问题吗?

这不是一个多维数组,它是由其他三个数组连接而成的数组

perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g); print join("\t",@h)."\n";'

如果您需要进一步的帮助,请提供所需的输出。

这不是多维数组,而是通过连接其他三个数组形成的数组

perl -e '@f=(1,2,3); @g=(4,5,6); @h=(@f,@g); print join("\t",@h)."\n";'

如果您需要进一步的帮助,请提供所需的输出。

我猜您的多维数组实际上是一个数组引用数组,因为这是Perl允许您在数组中嵌入数组的唯一方法

例如:

@array1 = ('20020701', 'Sending Mail in Perl', 'Philip Yuson');
@array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson');
@array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson');

@main = (\@array1, \@array2, \@array3);
要将它们打印到文件中,请执行以下操作:

open(my $out, '>', 'somefile.txt') || die("Unable to open somefile.txt: $!");
foreach my $row (@main) {
    print $out join(",", @{$row}) . "\n";
}
close($out);

我猜多维数组实际上是数组引用的数组,因为这是Perl将数组嵌入数组的唯一方法

例如:

@array1 = ('20020701', 'Sending Mail in Perl', 'Philip Yuson');
@array2 = ('20020601', 'Manipulating Dates in Perl', 'Philip Yuson');
@array3 = ('20020501', 'GUI Application for CVS', 'Philip Yuson');

@main = (\@array1, \@array2, \@array3);
要将它们打印到文件中,请执行以下操作:

open(my $out, '>', 'somefile.txt') || die("Unable to open somefile.txt: $!");
foreach my $row (@main) {
    print $out join(",", @{$row}) . "\n";
}
close($out);
我希望有两个方面:

 foreach my $row (@array) {
     print join ("\t", @{$row}) . "\n";
 }
Perl没有多维数组。相反,它的三个本机数据类型之一是一个称为列表的一维数组。如果在Perl中需要更复杂的结构,可以使用对列表中其他数据结构的引用。例如,列表中的每个项目都是对另一个列表的引用。主列表可以表示行,次列表是该行中的列值

在上面的
中,foreach
循环通过主列表(表示每行的列表),并且
$row
等于对表示列值的列表的引用

为了得到一个Perl列表而不是对列表的引用,我取消了对列表的引用。我是通过在它前面加一个
@
符号来实现的。我喜欢使用
@{$row}
,因为我认为它比只使用
@$row
要干净一些

现在我可以将我的列值列表引用为
@{$row}
,我可以使用
连接创建一个字符串,用制表符分隔
@{$row}
中的每个值并将其打印出来。

我希望有两个维度:

 foreach my $row (@array) {
     print join ("\t", @{$row}) . "\n";
 }
Perl没有多维数组。相反,它的三个本机数据类型之一是一个称为列表的一维数组。如果在Perl中需要更复杂的结构,可以使用对列表中其他数据结构的引用。例如,列表中的每个项目都是对另一个列表的引用。主列表可以表示行,次列表是该行中的列值

在上面的
中,foreach
循环通过主列表(表示每行的列表),并且
$row
等于对表示列值的列表的引用

为了得到一个Perl列表而不是对列表的引用,我取消了对列表的引用。我是通过在它前面加一个
@
符号来实现的。我喜欢使用
@{$row}
,因为我认为它比只使用
@$row
要干净一些

现在我可以将我的列值列表引用为
@{$row}
,我可以使用
连接来创建一个字符串,用制表符分隔
@{$row}
中的每个值并将其打印出来。

如果问题中的“多维”表示n>2,则制表符分隔格式可能不可行

在这种情况下,您是否希望解决更一般的问题:序列化数据结构

例如,看看YAML模块(安装YAML::XS)。有一个DumpFile(filepath,list)和一个LoadFile(filepath)方法。输出将不是以制表符分隔的文件,但仍然是可读的

您也可以使用JSON序列化程序,例如JSON::XS

如果问题中的“多维”表示n>2,则制表符分隔格式可能不可行

在这种情况下,您是否希望解决更一般的问题:序列化数据结构

例如,看看YAML模块(安装YAML::XS)。有一个DumpFile(filepath,list)和一个LoadFile(filepath)方法。输出将不是以制表符分隔的文件,但仍然是可读的


您也可以使用JSON序列化程序,例如JSON::XS

您的
@main
应使用括号
()
而不是方括号定义。它们是匿名数组引用。@BioLounge:有什么不起作用的?我刚刚测试了它,它对我来说很好。你的
@main
应该用括号
()
来定义,而不是方括号。它们是匿名数组引用。@BioLounge:有什么不起作用的?我刚刚测试了它,它对我来说很好。使用特殊变量的艺术怎么了?{local$,=“\t”;local$\=“\n”print@$\uForeach@h}($,是输出字段分隔符,$\是输出记录分隔符,local是为了避免污染其余代码)@mirod
print@$\ucode>如果不双重引用print arg,您确定数组会使用记录输出分隔符吗?看起来像这样,试试这个(unix):perl-e'@h=([1,2,3],[4,5,6]);$,=“\t”;$\=“\n”print$\uForeach@h'(如果不清楚的话,我也不推荐;--)啊,我现在看到你在那里做了什么,当我真正读到你写的东西时。=使用特殊变量的艺术发生了什么事?{local$,=“\t”;local$\=“\n”print$\=“\n”print$\uForeach@h}($,是输出字段分隔符,$\是输出记录分隔符,本地是为了避免污染其余的代码)@mirod
print@$\uz
如果不双引号引用print arg,您确定数组会使用记录输出分隔符吗?看起来像这样,试试这个(unix):perl-e'@h=([1,2,3],[4,5,6]);$,=“\t”;$\=“\n”“print$uuForeach@h”(如果不清楚的话,我也不推荐;--)啊,我现在看到你在那里做了什么,当我读到你的文章时