Mit*_*lWB 2 arrays perl dereference
我不是很擅长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
}
Run Code Online (Sandbox Code Playgroud)
首先,你应该始终把use strict;你的程序放在首位.这将在早期发现许多错误.
foreach循环中的最后一行是$thingy正确解除引用的行.但是,由于您已经放置@{$thingy}了.(字符串连接)运算符的左侧,因此数组位于标量上下文中,而标量上下文中的数组则根据其大小进行求值.说啊:
print "@{$thingy}\n";
Run Code Online (Sandbox Code Playgroud)
获取@$thingy由空格分隔的元素,或者通常
print join('|', @{$thingy}), "\n";
Run Code Online (Sandbox Code Playgroud)
如果要使用其他分隔符,例如竖线字符.你也可以这么说
print @{$thingy}, "\n";
Run Code Online (Sandbox Code Playgroud)
打印完全没有分隔符的元素.