为什么我的排序功能不起作用

时间:2013-10-08 01:44:15

标签: arrays perl sorting

我有一个文件,我已经读入一个数组,有多列,我想通过第二列数字排序。我查阅了无数类似的问题,并试图直接纳入给出的答案。

这是我正在使用的基本代码:

use strict;
use warnings;
use diagnostics;


my @arrayed = ( 
"\ndog", "10", "barks",
"\ncat", "20", "meows",
"\nfish", "5", "plop",
"\nant", "30", "walk",
);

print "@arrayed";

print "\n";

my @sortedarray = sort { $a->[1] <=> $b->[1] } @arrayed;

print "@sortedarray";

exit;

这给了我一个错误,当打开strict时,不能使用字符串(“dog”)作为数组引用。我尝试了其他一些文件,其他文件,数组,但总是得到这个消息所以我认为我的代码必定存在一些本质上的错误。

任何有经验的人都可以对我正在做错的事情略微说清楚,并允许我按编号列进行排序,同时仍保持行结构。

2 个答案:

答案 0 :(得分:6)

你有一个平面数组,但你想要一个数组数组:

use strict;
use warnings;
use diagnostics;
use Data::Dumper;

my @arrayed = ( 
["dog", "10", "barks"],
["cat", "20", "meows"],
["fish", "5", "plop"],
["ant", "30", "walk"],
);
print Dumper(\@arrayed);
my @sortedarray = sort { $a->[1] <=> $b->[1] } @arrayed;
print Dumper(\@sortedarray);

__END__

$VAR1 = [
          [
            'dog',
            '10',
            'barks'
          ],
          [
            'cat',
            '20',
            'meows'
          ],
          [
            'fish',
            '5',
            'plop'
          ],
          [
            'ant',
            '30',
            'walk'
          ]
        ];
$VAR1 = [
          [
            'fish',
            5,
            'plop'
          ],
          [
            'dog',
            10,
            'barks'
          ],
          [
            'cat',
            20,
            'meows'
          ],
          [
            'ant',
            30,
            'walk'
          ]
        ];

答案 1 :(得分:4)

您的作业不会创建多维数组:

my @arrayed = ( 
    "\ndog", "10", "barks",
    "\ncat", "20", "meows",
    "\nfish", "5", "plop",
    "\nant", "30", "walk",
);

您需要在这些括号内使用数组引用:

my @arrayed = ( 
    [ "\ndog", "10", "barks" ],
    [ "\ncat", "20", "meows" ],
    [ "\nfish", "5", "plop"  ],
    [ "\nant", "30", "walk" ]
);

括号[ ... ]创建匿名数组引用,然后可以将其存储在数组中。

调试时最重要的事情之一就是数据的外观。做一些像你做的事情

print "@arrayed";

不是很有用,因为它只显示按空格分隔的元素列表。此外,如果您使用多维数组完成此操作,您将获得如下输出:

ARRAY(0x7fd658) ARRAY(0x7fd7f0)

在字符串化时,数组引用是什么样的。相反,您应该使用Data::Dumper模块:

use Data::Dumper;
print Dumper \@arrayed;

请注意,您正在打印对数组的引用。输出将是一个数据结构,看起来像他的答案中显示的工具:

$VAR1 = [
           [ ...

请注意,括号再次表示数组引用。

相关问题