我似乎无法正确取消对数组的引用

我不太擅长Perl,但是我需要能够对多维数组进行排序。我一直在使用一些测试代码来尝试更好地理解这个概念,我想我已经接近了,但是我找不到魔术的组合。 我似乎无法做的是取消对数组的引用,并使它们正确打印。除了要引用的数组中的值之外,我似乎几乎了解了我需要了解的所有这些东西。 我从制表符分隔的平面文件中获取数据,因此在我的示例代码中,我通过拆分创建多个数组,然后将它们推入单个数组中,从而模仿了这一点。在实践中,我将遍历文件,在选项卡上拆分并将它们推入数组中。 如果有更好的解决方案,我全神贯注。平面文件中的每一行都是一条记录。我需要首先按日期排序以使最旧的记录排在最前面,然后进行辅助排序以按acct编号对记录进行分组。我已经在网上查看了几个示例,但没有发现任何与我需要模仿的数据兼容的东西。
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
}
    
已邀请:
首先,应始终在程序的顶部放置“ 1”。这将尽早发现许多错误。
foreach
循环中的最后一行是正确取消引用
$thingy
的那一行。但是,由于您已将ѭ4放在
.
(字符串串联)运算符的左侧,因此数组在标量上下文中,标量上下文中的数组将求值其大小。说啊:
print \"@{$thingy}\\n\";
得到由空格隔开的“ 7”的元素
print join(\'|\', @{$thingy}), \"\\n\";
如果要使用其他分隔符,例如竖线字符。你也可以说
print @{$thingy}, \"\\n\";
打印完全没有分隔符的元素。     
@thingy
是未声明和未定义的(并且是不必要的)。 使用两个嵌套循环 使用数组引用遍历数组 然后在每个循环中遍历该引用数组中的项目。 像这样
foreach my $array_ref (@sorted)
{
    foreach my $item (@{$array_ref}) {
        print $item, \",\";
    }
    print \"\\n\";
}
表达式“ 12”将取消引用您的数组引用。然后将其用作数组。 加成: 您可以更换
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);
my @array = ();
push(@array, map { [split(/:/, $_)] } qw(X:Y:Z A:B:C Q:L:P:0 U:E:G));
如果排序需要两个条件(主要条件在第一个索引处,辅助条件在第二个索引处),则可以这样写:
my @sorted = sort { $a->[0] cmp $b->[0] 
                             ||
                    $a->[1] cmp $b->[1] 
                  } @array;
    
您需要做的第一件事是将其添加到脚本中:
use strict;
use warnings;
然后您将得到警告:
Global symbol \"@thingy\" requires explicit package name
这意味着没有定义“ 10”。在perl中,
$thingy
@thingy
算作单独的变量。 创建数组的另一种方法是使用匿名数组,如下所示:
push @array, [ split(/:/, \'X:Y:Z\') ];
push @array, [ split(/:/, \'A:B:C\') ];
...
然后,您将不必创建一次性变量。或使用您描述的文件(
\\t
是标签):
while (<>) {
    push @array, [ split /\\t/, $_ ];
}
一种从perlmonks对多列进行排序的方法:
my @a = ([1,2], [3,4]);
my @b = sort {

    $a->[0] <=> $b->[0] || # the result is -1,0,1 ...
    $a->[1] <=> $b->[1]    # so [1] when [0] is same

} @a;
http://www.perlmonks.org/index.pl?node_id=674374 当然,这假定您的字段中为数值。否则使用
cmp
。 打印:
for my $ref (@array) {
    my $i = 0;
    for my $value (@$ref) {
        print $value; 
        print \",\" if ($i++ < $#$ref); # comma delimited
    }
    print \"\\n\"; # end of record
}
    

要回复问题请先登录注册