0

我有一个文件,我已读入一个包含多列的数组,我想按第二列进行数字排序。我查找了无数类似的问题,并试图直接结合给出的答案。

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

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;

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

请任何更有经验的人对我做错了什么有所了解,并允许我在保持行结构的同时按编号列排序。

4

2 回答 2

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'
          ]
        ];
于 2013-10-08T01:52:45.993 回答
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 = [
           [ ...

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

于 2013-10-08T01:52:37.123 回答