perl 为什么我不能按第二列进行数字排序?

col17t5w  于 2023-06-06  发布在  Perl
关注(0)|答案(2)|浏览(239)

我有一个文件,我已经读入一个数组,有多列,我想按第二列进行数字排序。下面是我使用的基本代码:

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打开时,不能使用string(“dog”)作为数组引用。
我用其他文件尝试了一些其他的例子,但总是得到这个消息,所以我假设我的代码一定有本质上的错误。
有没有更有经验的人能指出我做错了什么,并允许我在保持行结构的同时按编号列进行排序?

wljmcqd8

wljmcqd81#

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

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);

输出:

$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'
          ]
        ];
cpjpxq1n

cpjpxq1n2#

您的赋值不会创建多维数组:

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;

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

$VAR1 = [
           [ ...

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

相关问题