2016-07-25 2 views
1

Попытка это:Список Perl :: AllUtils уник и сортировать

perl -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = uniq @x; say "@y"' 

Это правильно печатает

2 3 1 2 
2 3 1 

Теперь хочу отсортированный выход, так пробовал:

perl -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = sort uniq @x; say "@y"' 

Удивительно печатает :

2 3 1 2 
2 1 3 2 

Переключение порядок uniq и sort

perl -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = uniq sort @x; say "@y"' 

дает правильный результат

2 3 1 2 
1 2 3 

Таким образом, сопоставив их с помощью MO=Deparse.

1-й:

perl -MO=Deparse -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = uniq @x; say "@y"' 
sub BEGIN { 
    require v5.14; 
} 
use List::AllUtils (split(/,/u, 'uniq', 0)); 
use strict; 
use feature 'current_sub', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; 
my(@x) = ('2', '3', '1', '2'); 
say join($", @x); 
my(@y) = &uniq(@x); 
say join($", @y); 
-e syntax OK 

второй:

perl -MO=Deparse -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = sort uniq @x; say "@y"' 
sub BEGIN { 
    require v5.14; 
} 
use List::AllUtils (split(/,/u, 'uniq', 0)); 
use strict; 
use feature 'current_sub', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; 
my(@x) = ('2', '3', '1', '2'); 
say join($", @x); 
my(@y) = (sort uniq @x); 
say join($", @y); 
-e syntax OK 

третий:

perl -MO=Deparse -Mv5.14 -MList::AllUtils=uniq -E 'my(@x) = qw(2 3 1 2); say "@x"; my(@y) = uniq sort @x; say "@y"' 
sub BEGIN { 
    require v5.14; 
} 
use List::AllUtils (split(/,/u, 'uniq', 0)); 
use strict; 
use feature 'current_sub', 'evalbytes', 'fc', 'postderef_qq', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; 
my(@x) = ('2', '3', '1', '2'); 
say join($", @x); 
my(@y) = &uniq(sort(@x)); 
say join($", @y); 
-e syntax OK 

Разница заключается в том, как называется uniq подпрограммой:

my(@y) = (sort uniq @x); # sort uniq @x 
my(@y) = &uniq(sort(@x)); # uniq sort @x 

Я понимаю, чем uniq является подпрограммой предусмотрено List::AllUtils и sort является встроенная функция, но с использованием uniq как:

my(@y) = &uniq(sort(@x)); 

не кажется мне очень intutive.

Должен ли я использовать его в форме &uniq(...), например. с & и скобкой? Coudl кто-то, пожалуйста, добавьте дополнительную информацию?

ответ

2

Если вы запустите его с помощью use strict и use warnings, он сообщает вам, что не так.

use strict; 
use warnings; 
use feature 'say'; 
use List::AllUtils 'uniq'; 

my (@x) = qw(2 3 1 2); 
say "@x"; 
my (@y) = sort uniq @x; 
say "@y"; 

Это дает Роде подпрограммой предупреждение не возвращать одно значение на. sort считает, что uniq является подпрограммой, которую он должен использовать для сортировки списка.

The sort documentation объясняет это.

сортировать подимени СПИСОК
сортировать BLOCK LIST
сортировать СПИСОК

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

# sort using explicit subroutine name 
sub byage { 
    $age{$a} <=> $age{$b}; # presuming numeric 
} 
my @sortedclass = sort byage @class; 

Таким образом, в данном случае, это относится к вашей uniq не как _call uniq(@x) и сортировки возвращаемого значения, используя sort поведение по умолчанию, но вместо этого он делает сортировки @x с использованием uniq как функции сортировки.


Вы можете sort игнорировать суб имя и использовать возвращаемое значение вместо, предваряя + знак.

my (@x) = qw(2 3 1 2); 
say "@x"; 
my (@y) = sort +uniq @x; 
say "@y"; 

__END__ 
2 3 1 2 
1 2 3 

И нет никакого предупреждения. sort +uniq(@x) также работает, и его легче читать.

+0

Использование -Mv5.14 позволяет 'strict' и даже ваш пример с' warnings' не выводит никаких предупреждений. По крайней мере для меня - с помощью 'v5.24.0'. – kobame

+0

@kobame хм, это странно. У меня 5,20. Но это все еще то, что происходит. Предупреждение или предупреждение. Вы переписываете поведение по умолчанию, присваивая ему суб-имя – simbabque

+1

'sort (uniq (@x))' отлично работает, если после 'uniq' нет места – Borodin

Смежные вопросы