我不太擅长 Perl,但我需要能够对多维数组进行排序。我一直在玩一些测试代码,试图更好地理解这个概念,我想我已经接近了,但我找不到神奇的组合。
我似乎无法做的是取消引用我的数组并让它们正确打印。除了被引用的数组中的值之外,我似乎可以获得关于这些引用的世界上我需要了解的几乎所有内容。
我从制表符分隔的平面文件中获取数据,因此在我的示例代码中,我通过拆分创建多个数组然后将它们插入单个数组来模仿它。实际上,我将遍历文件,拆分选项卡并将它们插入数组。
如果有更好的方法来解决这个问题,我会洗耳恭听。平面文件中的每一行都是一条记录。我需要先按日期排序以使最旧的记录排在最前面,然后进行二次排序以按帐号对记录进行分组。我在网上查看了几个示例,但没有发现任何似乎适用于我需要模仿的数据。
my @s1 = split(/:/, 'X:Y:Z');
my @s2 = split(/:/, 'A:B:C');
my @s3 = split(/:/, 'Q:L:P:0');
my @s4 = split(/:/, 'U:E:G');
my @array = ();
push(@array, \@s1);
push(@array, \@s2);
push(@array, \@s3);
push(@array, \@s4);
print "@array\n";
my @sorted = sort { $a->[0] cmp $b->[0] } @array;
print "\n";
foreach $thingy (@sorted)
{
print @thingy . "\n"; #result: number 0
print $thingy . "\n"; #result: reference
#print ${$thingy} . "\n"; #result: 'Not a scalar reference' error
print ${@thingy} . "\n"; #result: file name (???)
print @{$thingy} . "\n"; #result: length of the array referenced
}
最佳答案
首先,您应该始终将 use strict;
放在程序的顶部。这将及早发现大量错误。
foreach
循环中的最后一行是正确取消引用 $thingy
的那一行。但是由于您将 @{$thingy}
放在了 .
(字符串连接)运算符的左侧,因此数组处于标量上下文中,而数组处于标量上下文评估它们的大小。就说:
print "@{$thingy}\n";
获取 @$thingy
的元素,用空格分隔,或者一般情况下
print join('|', @{$thingy}), "\n";
如果你想使用另一个分隔符,比如竖线字符。你也可以直接说
print @{$thingy}, "\n";
打印完全没有分隔符的元素。
关于arrays - 我似乎无法正确取消引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103509/