Как отсортировать список массивов массивов - PullRequest
1 голос
/ 18 октября 2011

Вот скрипт

use strict;

sub sortF {
my $l1 = hex ${@$a}[0];
my $l2 = hex ${@$b}[0];
return $l1 <=> $l2;
}

my @results;

my @parsedLine = ['0x1a',"hello"];
push(@results, @parsedLine);

my @parsedLine2 = ['0x1b',"ohello"];
push(@results, @parsedLine2);

my @sortedresults = sort(sortF(@results));

Я хочу отсортировать список @results по первому элементу анонимного массива, на который указывают элементы списка

Это выдает ошибку

Can't use string ("0") as an ARRAY ref while "strict refs" in use at ...

Как должна быть написана функция sortF?

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Вы допустили ряд небольших ошибок при использовании ссылок, вам следует взглянуть на perlref и perlsort для получения подробной информации о том, что делать:

use strict;

sub sortF {
    my $l1 = hex $a->[0]; # just use $arrayref->[index]
    my $l2 = hex $b->[0];
    return $l1 <=> $l2;
}

my @results;

my @parsedLine = ('0x1a',"hello"); # use () to make a list
push(@results, \@parsedLine); # but push an array ref

# or create an anon array ref with [] and push it immediately
push(@results, ['0x1b',"ohello"]); 

# here use the `sort SUBNAME LIST' syntax
my @sortedresults = sort sortF @results;

print join(":", map {$_->[1]} @sortedresults), "\n";
3 голосов
/ 18 октября 2011

Вы звоните sortF прямо здесь:

my @sortedresults = sort(sortF(@results));

когда вы хотите сказать sort, чтобы использовать sortF в качестве функции сравнения:

my @sortedresults = sort sortF @results;

Сначала вы вызываете sortF(@results) и передаете результат вызова этой функции на sort. Но и $a, и $b будут пустыми внутри sortF, потому что sort не настроил их, это означает, что и $l1, и $l2 будут пустыми и $l1 <=> $l2 будет нулевым Так что ваш

my @sortedresults = sort(sortF(@results));

становится:

my @sortedresults = sort(0);

и вот откуда приходит сообщение об ошибке.

2 голосов
/ 18 октября 2011

Помимо проблемы , упомянутой mu, слишком коротка , ${@$a}[0] не делает то, о чем вы, вероятно, думаете: она пытается использовать размер массива @$a как ссылка на массив, генерируя предупреждение, которое вы видите.Я предполагаю, что вы имели в виду $a->[0] (или $$a[0], если вам нравится синтаксис разыменования в старом стиле).

Кроме того, my @parsedLine = ['0x1a',"hello"]; делает не совсем то, что, как вам кажется, кажется, такжесоздает одноэлементный массив, содержащий ссылку на массив из двух строк.Здесь это на самом деле не имеет значения (когда вы помещаете массив в другой, все элементы помещаются последовательно), но это может укусить вас позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...