Сортировка массива, который является значением в хэше в Perl - PullRequest
5 голосов
/ 08 декабря 2010

Я пытаюсь отсортировать массив , который является значением в хэше .Следующая строка кода:

sort @{ $hash{$item}{'lengths'} };

выдает следующую ошибку:

Useless use of sort in void context at ...

Ответы [ 4 ]

7 голосов
/ 08 декабря 2010

В Perl, sort не изменяет массив;возвращает отсортированный список.Вы должны назначить этот список где-нибудь (либо обратно в исходный массив, либо где-то еще).

@{ $hash{$item}{'lengths'} } = sort @{ $hash{$item}{'lengths'} };

Или (особенно если массив находится глубоко во вложенном хэше):

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort @$arrayref;

Ваш исходный код сортировал массив, а затем выбрасывал отсортированный список, поэтому он выдает это предупреждение.

Примечание: Как указано salva out, по умолчанию sort выполняет сравнение строк.Возможно, вам нужна числовая сортировка, которую вы получите, используя sort { $a <=> $b } вместо просто sort:

my $arrayref = $hash{$item}{'lengths'};
@$arrayref = sort { $a <=> $b } @$arrayref;

Но это не имеет ничего общего с предупреждением, о котором вы спрашивали.

3 голосов
/ 08 декабря 2010

Perl's sort не переупорядочивает список "на месте". Он на самом деле создает копию списка, а затем сортирует и возвращает. так что сделайте это cjm ,

Вы можете прочитать аналогичную проблему по этой ссылке ( см. Пример части )

2 голосов
/ 08 декабря 2010

Также обратите внимание, что если вы сортируете длины, вам придется использовать числовое сравнение:

my $lengths = $hash{$item}{'lengths'};
@$lengths = sort { $a <=> $b } @$lengths;
0 голосов
/ 08 декабря 2010

Я пробовал что-то подобное

my %lrn_hash;

$lrn_hash{1} = 1;
@{$lrn_hash{1}{VALS}} = (6,7,1,5,7,9);

@narr = sort @{$lrn_hash{1}{VALS}};
print "@narr\n";

и все работало нормально, а результат был

1 5 6 7 7 9

Какую версию Perl вы используете?

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