arrays - 我似乎无法正确取消引用数组

标签 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
}

最佳答案

首先,您应该始终将 use strict; 放在程序的顶部。这将及早发现大量错误。

foreach 循环中的最后一行是正确取消引用 $thingy 的那一行。但是由于您将 @{$thingy} 放在了 . (字符串连接)运算符的左侧,因此数组处于标量上下文中,而数组处于标量上下文评估它们的大小。就说:

print "@{$thingy}\n";

获取 @$thingy 的元素,用空格分隔,或者一般情况下

print join('|', @{$thingy}), "\n";

如果你想使用另一个分隔符,比如竖线字符。你也可以直接说

print @{$thingy}, "\n";

打印完全没有分隔符的元素。

关于arrays - 我似乎无法正确取消引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103509/

相关文章:

javascript - 使用 Web::Scraper 提取 javascript

Perl 和 Rose::DB Postgres 事务

perl - 守护进程关闭和清理

c++ - 取消引用指向访问元素的 vector 指针

Javascript函数判断数组元素是否已经存在

Javascript - 插入 JSON 数组

c - 反转 '\0' 终止的 C 字符串?

c++ - 取消引用指针(并返回它)的问题

javascript - JavaScript 数组中的对象

c++ - 如何在 C++ 中获取字符串数组的最后一个索引