powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - непонятности с порядком выполнения
22 сообщений из 22, страница 1 из 1
Perl - непонятности с порядком выполнения
    #38844404
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
> perl -e "use List::MoreUtils qw(uniq); print join(',', uniq (1,1,2))"                  
1,2

> perl -e "use List::MoreUtils qw(uniq); print join(',', sort uniq (1,1,2))"
1,1,2

> perl -e "use List::MoreUtils qw(uniq); print join(',', uniq sort (1,1,2))"
1,2

> perl -e "use List::MoreUtils qw(uniq); print join(',', sort(uniq((1,1,2))))"
1,2



Почему "uniq sort" и "sort uniq" дают разный результат?
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38844683
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не верю! Ща проверю:
Код: php
1.
2.
$ perl -e "use List::MoreUtils qw(uniq); print join(',', sort uniq (1,1,2))"
Sort subroutine didn't return single value at -e line 1.



Угу? Смотрим...
http://search.cpan.org/~rehsack/List-MoreUtils-0.402/lib/List/MoreUtils.pm#uniq_LIST
Ага! Значит в моем случае, оно возвращало двоечку, а sort на нее ругался, ибо не список.
А вот что у тебя происходит? Ну на вскидку: какая у тебя версия MoreUtils?
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38844790
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у него, походу, винда...
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38844824
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Debian так же.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845172
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

почувствуй разницу:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
perl -Mstrict -MList::MoreUtils=uniq -e  'print sort uniq' 

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort uniq()'

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort uniq(1,2,3)'

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort uniq 1,2,3'

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort( uniq 1,2,3 )'

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort ( (uniq 1,2,3 ) )'

perl -Mstrict -MList::MoreUtils=uniq -e  'print sort (  (  uniq (1,2,3)  )  )'


и ты поймёшь, что самый лучший результат даёт

Код: php
1.
perl -Mstrict -MList::MoreUtils=uniq -e 'print sort( uniq(1,2,3) )


и

Код: php
1.
perl -Mstrict -MList::MoreUtils=uniq -e 'print uniq( sort(1,2,3) )
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845222
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос как-бы не в том, какой вариант дает лучший результат.
Вопрос в том, почему результаты вообще отличаются?
Код: php
1.
2.
3.
4.
> perl -MList::MoreUtils=uniq -e "my @lst = ('c','b','c'); print join(',',sort uniq @lst) . \"\n\";"  
b,c,c
> perl -MList::MoreUtils=uniq -e "my @lst = ('c','b','c'); print join(',',sort(uniq(@lst))) . \"\n\";"  
b,c


Почему sort uniq @array это не то же самое, что sort(uniq(@array))?
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845226
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воспроизводится на Debian и Windows.
Версии Perl v5.14.2 (в обоих случаях).
Версия List::MoreUtils 0.33, но я вообще не представляю, причем тут она — проблема ведь не с функцией uniq, а с тем, как результаты функций передаются по конвейеру.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845240
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
> perl -MList::MoreUtils=uniq -e "my @lst = ('c','b','c'); print join(',',uniq(@lst)) . \"\n\";"     
c,b
> perl -MList::MoreUtils=uniq -e "my @lst = ('c','b','c'); print join(',',sort uniq(@lst)) . \"\n\";"
b,c,c


То есть дело даже не в том, что парсер неправильно понял синтаксис и решил развернуть массив и добавить к нему uniq как аргумент (то есть парсер не интерпретирует выражение, как sort(uniq,'c','b','c')).
Для меня вообще загадка, откуда во втором случае (sort union(@lst)) функция sort получила исходный массив.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845300
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

во втором случае функция не получила исходный массив.

a получила: sort subroutine didn't return single value at -e line 1

я для чего все те примеры, которые выше, приводил?

сам же и отвечу: для того, чтобы пришло понимание, что парсер разбирает аргументы подпрограммы,
которые через пробел без скобок таким образом, что предугадать невозможно(трудно);
поэтому думать об этом не стоит, а стоит писать вызов со скобками, чтобы ВСЕМ было легче
( и слону и даже маленькой улитке )
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845314
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я и другой пример ниже привел:
Код: php
1.
2.
# perl -Mstrict -MList::MoreUtils=uniq -e "my @lst = ('c','b','c'); print join(',',sort uniq(@lst)) . \"\n\";" 
b,c,c


Тут уже у парсера нет возможности что-то понять неправильно.
И отсутствие ошибок при заданном strict это подтверждает.
Однако функция sort возвращает три значения, хотя uniq(@lst) возвращает только два.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845676
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

ты слушаешь только себя,

тогда сам с собой и разговаривай.


последняя 4-ая попытка: твой пример
sort uniq(@lst)

соответствует моему
sort uniq()

из того большого списка бесскобочных вызовов.

я специально его подбирал, тратил своё время, чтоб ты посмотрел на диагностику,

она показательна.

как оказалось зря.

ты мне надоел.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38845816
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661ты слушаешь только себя,
Симметрично.

Я проверил указанные выше варианты, они у меня не возвращают ошибки.
И вопрос был не в том, почему при явном задании приоритетов с помощью скобок функции возвращают ожидаемые значения.
А в том, почему с одним и тем же списком, но разным порядком функций, возвращаются разные результаты.
Или, другими словами, почему "sort uniq(@lst)" возвращает три элемента? Он должен вернуть или два элемента (результат uniq), или один элемент (если uniq вернет скаляр, а не список), или ошибку (если uniq вернет скаляр, а sort работает только со списком).
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846008
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Или, другими словами, почему "sort uniq(@lst)" возвращает три элемента? Он должен вернуть или два элемента (результат uniq), или один элемент (если uniq вернет скаляр, а не список), или ошибку (если uniq вернет скаляр, а sort работает только со списком).Потому что у тебя баг в List::MoreUtils.

У меня "sort uniq(@lst)" выдает ожидаемую ошибку. И на Mint, и на Debian, и на Win/Strawberry. На AIX'овой версии проверить не смог, у меня там нету List::MoreUtils модуля...

Сделай в командной строке: cpan.
В его командной строке: i List::MoreUtils
Смотри что у тебя в INST_VERSION.

И кстати, этот модуль пару дней назад обновили. Хотя у меня и 0.33 работает замечательно.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846065
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно.
MoreUtils мне кажется тут вообще не причем.
uniq, как и положено, в списочном контексте возвращает список.
Если парсер не может правильно обработать "sort uniq(@lst)", то он должен возвратить ошибку. Но раз ошибки у меня нет, значит парсер отработал правильно и аргументом для sort взял список.
Но почему в этом списке 3 элемента, я понять не могу.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846187
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlAlibek B.Или, другими словами, почему "sort uniq(@lst)" возвращает три элемента? Он должен вернуть или два элемента (результат uniq), или один элемент (если uniq вернет скаляр, а не список), или ошибку (если uniq вернет скаляр, а sort работает только со списком).Потому что у тебя баг в List::MoreUtils.

У меня "sort uniq(@lst)" выдает ожидаемую ошибку. И на Mint, и на Debian, и на Win/Strawberry. На AIX'овой версии проверить не смог, у меня там нету List::MoreUtils модуля...

Сделай в командной строке: cpan.
В его командной строке: i List::MoreUtils
Смотри что у тебя в INST_VERSION.

И кстати, этот модуль пару дней назад обновили. Хотя у меня и 0.33 работает замечательно.


не надо никаких конспирологических версий.

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


uniq я уж как-нить и сам могу написать, безо всяких там Моря Утилсов.

sub uniq (@) { $h{$_}=1 for @_; return keys %h }

проверяем:

Код: php
1.
perl -e ' sub uniq (@) { $h{$_}=1 for @_; return keys %h }  $,="#";  print sort( uniq( 9, 8, 1,1,2,2,3,3,4,5,6,7,0) )'



0#1#2#3#4#5#6#7#8#9


теперь так:

Код: php
1.
perl -e ' sub uniq (@) { $h{$_}=1 for @_; return keys %h }  print sort uniq( 9, 8, 1,1,2,2,3,3,4,5,6,7,0) '


9#8#1#1#2#2#3#3#4#5#6#7#0

знакомая картина?

теперь засовываем отладочный print унутрь.
Код: php
1.
perl -e ' sub uniq (@) { $h{$_}=1 for @_; printf"*%s*\n", keys%h;   keys%h }  $, ="#";  print sort uniq (1,1,2) '




**
**
**
1#1#2


уже теплее?

и для проверки догадки:


Код: php
1.
perl -e ' sub uniq (@) { $h{$_}=1 for @_; printf"*%s*\n", keys%h;   keys%h }  print sort uniq (1) '


1


то есть, uniq даже не вызывался.

Итак: этот вызов
Код: php
1.
sort uniq (@list)



Pеrl трактует как
Код: php
1.
sort { uniq() } @list;



Поэтому, чтобы не думать

print sort( uniq( 1,1,2) );

uniq( sort ( 1,1,2) );
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846195
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, наконец, ВОТ:

Perl6
Код: php
1.
say sort uniq 1,2,1,2,3;


1 2 3
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846237
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661Pеrl трактует как
Код: php
1.
sort { uniq() } @list;



Вот оно что.
На это моей фантазии не хватило.
Правда тогда непонятно, почему у меня вывод сортировался. Ведь uniq в скалярном контексте всегда будет возвращать положительное значение и сортировка не должна выполняться.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846700
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.volodin661Pеrl трактует как
Код: php
1.
sort { uniq() } @list;



Вот оно что.
На это моей фантазии не хватило.
Правда тогда непонятно, почему у меня вывод сортировался. Ведь uniq в скалярном контексте всегда будет возвращать положительное значение и сортировка не должна выполняться.

Код: php
1.
perl -e '$, = q/,/;     print sort {1} (4,3,2,1)'



1,2,3,4
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846766
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имею ввиду, что для синтаксиса @sorted = sort {&function} @unsorded если сортировочная функция/выражение всегда возвращает положительное значение, значит при сортировке всегда предполагается, что $a>$b. То есть по сути сортировка не осуществляется, а элементы просто выводятся в обратном порядке.
А у меня какая-то странность.

Perl v5.14.2 (Debian и Windows):
Код: php
1.
2.
3.
4.
5.
> perl -Mstrict -MList::MoreUtils=uniq -e "print sort uniq (1,2,3)"
123

> perl -e "print sort {1} (1,2,3)"                                
321



Perl v5.16.1 (FreeBSD и Windows):
Код: php
1.
2.
3.
4.
5.
> perl -Mstrict -MList::MoreUtils=uniq -e "print sort uniq (1,2,3)"
Sort subroutine didn't return single value at -e line 1.

> perl -e "print sort {1} (1,2,3)"
321



То есть sort {1} (1,2,3) действительно не сортирует.
А вот sort uniq (1,2,3) в первой среде (в версии 5.14.2) сортировку осуществляет.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38846969
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

там всё совсем неоднозначно с пользовательской сортировкой.

подсовываемые константы разрушают алгоритм.


Код: php
1.
2.
3.
perl -e 'print sort { print "$a : $b\n";   $a<=>$b } (1,2,3,4,5);'
perl -e 'print sort { print "$a : $b\n";   1 } (1,2,3,4,5);'
perl -e 'print sort { print "$a : $b\n";  -1 } (1,2,3,4,5);'
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38847026
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем ничего не понял.
Просто запомню, что так делать не надо.
...
Рейтинг: 0 / 0
Perl - непонятности с порядком выполнения
    #38847991
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, вы ему еще про Сорс фильтры не рассказали?.. Может поможет..
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl - непонятности с порядком выполнения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]