Подтвердить что ты не робот

Почему Perl v5.22 не находит все границы предложения?

Это зафиксировано в Perl 5.22.1. Я пишу об этом в Perl v5.22 добавляет фантастические границы слова Unicode.


Perl v5.22 добавил утверждения Unicode из TR # 29. Я играю с утверждением границы предложения, но кажется, что он находит начало и конец текста:

use v5.22;

$_ = "See Spot. (Spot is a dog.) See Spot run. Run Spot, run!\x{2029}New paragraph.";

while( m/\b{sb}/g ) {
    say "Sentence boundary at ", pos;
    }

Выходные границы предложений предложений в начале и конце текста, но не после полных остановок, терминаторов предложений или паренов:

Sentence boundary at 0
Sentence boundary at 70

Unicode breaks tester показывает их в основном, я ожидаю их на основе TR # 29.

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

4b9b3361

Ответ 1

Комментарий Calle Dybedahl исправляет (и когда они превращают его в ответ, я соглашусь с этим). Это было сломанной особенностью в v5.22.0, и, насколько я могу судить, непроверено. Вчера у меня возникла проблема с компиляцией последних новостей и закончился день с вопроса.

Perl5.22.1 perldelta не упоминает конкретных изменений (и "упоминание" может быть слишком сильным, поскольку оно просто ссылается на возможные вещи, которые были неправильными, не перечисляя их). Он упоминает как несовместимое изменение с 5.20.0 (ошибка вырезания и вставки?), "Единственное" исключение, затем более одной проблемы. Ссылка на "здравомыслящий" заставила меня подумать, что все изменения были связаны с проблемой паники в следующем подразделе. Упоминание "нескольких ошибок" только с одной ссылкой rt.perl.org заставило меня подумать, что эти ошибки были связаны с проблемой паники.

= head1 Несовместимые изменения

Нет изменений, преднамеренно несовместимых с 5.20.0, кроме после единственного исключения, которое мы считаем разумным изменением в чтобы получить новые возможности C <\b {wb} > и (в частности) C <\b {sb} > прежде чем люди решили, что они бесполезны из-за ошибок в их Perl 5.22.0 и избегать их в будущем. Если какие-либо другие существуют, они являются ошибками, и мы просим вас представить отчет. См. L ниже.

= head2 Bounds Проверка конструкций

Несколько ошибок, включая ошибку сегментации, были исправлены с границами (введенные в Perl 5.22) C <\b {gcb} > , C <\b {sb} > , C <\b {wb} > , C <\B {gcb} > , C <\B {sb} > и C <\B {wb} > . Все C <\B {} > теперь соответствуют пустым строка; ни один из C <\b {} > не делает. L < [perl # 126319] | https://rt.perl.org/Ticket/Display.html?id=126319 >

Кроме того, perlrebackslash, где новые границы документированы, не упоминает, что они не работают в v5.22.0.

Я проигнорировал возможное исправление из-за несоответствий в perldelta и предыдущего опыта, который у меня был, что новые функции недостаточно (или даже вообще) протестированы в perl-источнике. Я преждевременно отрезал эту линию расследования и мог спасти себя пару часов. Это, конечно, моя ошибка в том, что код не работает в последних двоичных файлах, но я понял, что я делаю что-то неправильно и что мой код был проблемой. Несмотря на мои многочисленные прошлые впечатления об обратном, я не занимал мысли (кроме обновления для UCD), что perl был неправильным.

Теперь, когда я нахожусь на другой машине и имею рабочий perl-5.22.1, я вижу, что моя программа работает так, как ожидалось, в выпуске точки. Перлэлта могла бы быть намного лучше здесь.

Ответ 2

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

Во-первых, это опечатка, что perldelta для 5.22.1 говорит 5.20.0, когда это означает 5.22.0. В нем упоминается только одна проблема, потому что в наших умах они были всего лишь одним, Unicode нарушает границы.

Они были добавлены в конце 5.22, и мы не понимали, что были проблемы до тех пор, пока не отправлено 5.22. И когда возникли проблемы, некоторые из них оказались ошибками в указанном Unicode алгоритме, и мы предположили, что все они были такими.

Но все было проверено, и я подумал, достаточно много. Последние выпуски Unicode включают публикации тестов для различных функций, а 5.22.0 прошли все эти тесты. Вы можете найти их в lib/unicore/TestProp.pl, который запускается каждый раз, когда выполняется "make test", exec'd by t/re/uniprops.t. Те, о которых идет речь, вызывается Test_SB() (более 500) и Test_WB() (почти 1500), и каждый тест состоит из нескольких подтестов. Это были больше тестов, чем я сам придумал.

Независимо, кто-то сообщил о segfault в начале процесса разработки 5.23. Исследуя это, я увидел, прочитав код, что есть другие проблемы в только что отправленном коде. Взаимодействия сложны и нелегко суммируются, поэтому пердэлта даже не пытался. Оба этих граничных условия требуют отслеживания контекста, в котором могут возникать границы, часто делая внешний вид и/или внешний вид. Когда код анализируется через целевую строку, он сохраняет текущий контекст для следующей итерации, где он будет выглядящим контекстом, и его не нужно пересчитывать. Это было нарушено, и контекст не всегда был правильно сохранен. Вот почему все прошедшие Unicode тесты прошли. Они были для краткого ввода, где разрывы контекста не имели значения. Когда все это было исправлено, я был приятно удивлен, что \b {sb} дал результаты, которые были более ожидаемыми людьми.

Ошибки Unicode планируется исправлять в следующей версии UAX # 29, и я думаю, что мы приняли правильное решение при работе \b {wb} и \b {sb} в 5.22.1.