Попытка это:Список 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 кто-то, пожалуйста, добавьте дополнительную информацию?
Использование -Mv5.14 позволяет 'strict' и даже ваш пример с' warnings' не выводит никаких предупреждений. По крайней мере для меня - с помощью 'v5.24.0'. – kobame
@kobame хм, это странно. У меня 5,20. Но это все еще то, что происходит. Предупреждение или предупреждение. Вы переписываете поведение по умолчанию, присваивая ему суб-имя – simbabque
'sort (uniq (@x))' отлично работает, если после 'uniq' нет места – Borodin