Каковы некоторые конкретные примеры обратной несовместимости в версиях Perl? - PullRequest
12 голосов
/ 06 декабря 2009

Между первым публичным выпуском Perl 1.0 (18 декабря 1987 г.) и текущим стабильным выпуском 5.10.1 (2009) прошло 22 года.

За эти 22 года были выпущены следующие заметные релизы:

  • Perl 1.0 (1987 - первый выпуск)
  • Perl 2 (1988 - улучшенные регулярные выражения)
  • Perl 3 (1989 - поддержка двоичных потоков данных)
  • Perl 4 (1991 - определение версии Perl, описанной в «Книге верблюдов»)
  • Perl 5 (1994 г. - внесены основные изменения, почти полная перезапись интерпретатора)
  • Perl 5.6 (2000 - 64-битная поддержка, строки Unicode, поддержка больших файлов)
  • Perl 5.8 (2002 - улучшена поддержка юникода, новая реализация ввода-вывода)
  • Perl 5.10 (2007 - новый оператор switch, обновления регулярных выражений, оператор умного соответствия)

Я ищу конкретные примеры обратной несовместимости в истории Perl.

Вопрос:

  • Есть ли в 22-летней истории Perl какие-либо примеры обратной несовместимости Perl, когда исходный код Perl для Perl версии X не будет работать в версии Y (где Y> X)?

Пожалуйста, включайте ссылки и примеры кода, когда это возможно.

Ответы [ 5 ]

14 голосов
/ 07 декабря 2009

Одной из самых больших преднамеренных несовместимостей является интерполяция массивов, которая изменилась между Perl 4 и Perl 5.

my @example = qw(1 2 3);
print "foo@example.com";

В Perl 4 это будет:

foo@example.com

В Perl 5 это будет:

foo1 2 3.com

К счастью, если массив не существует, Perl предупредит вас о «возможной непреднамеренной интерполяции».

Темы претерпели большие изменения между 5.005 и 5.6. «5005 потоков» использовал традиционную модель потоков POSIX, где все глобальные данные являются общими. Хотя теоретически это было быстрее, потому что тогда Perl мог просто использовать потоки POSIX, это был кошмар для кодеров Perl. Большинство модулей Perl не были поточно-ориентированными. И это никогда не получалось.

В 5.6 ActiveState и другие сделали fork () для Windows. Когда вы выполняете fork () в Windows, Perl создает копию объекта интерпретатора и запускает коды операций обоих интерпретаторов. Это было известно как «множественность».

В 5.8 Артур Бергман побежал с этим и использовал его для создания цепочек. Поскольку множественность эмулирует отдельный процесс, данные по умолчанию не передаются. Только данные, о которых вы говорите, являются общими. Это делает их намного безопаснее в использовании, хотя прошло много времени, прежде чем он стал стабильным. Такие люди, как Элизабет Маттийсен и Джерри Хедден, сделали это возможным.

5005 нитей были окончательно удалены в 5.10.0. Уровень совместимости существует, но я сомневаюсь, что он действительно будет работать в рабочем коде.

Другая большая несовместимость возникла в Юникоде между 5.6 и 5.8. Юникод в 5.6 сдул. Независимо от того, была ли строка Unicode, решала окружающая область. Он был полностью переработан в 5.8, так что теперь Unicodeiness строки привязан к строке. Код, написанный с использованием Unicode 5.6, обычно нужно было переписывать в 5.8, часто потому, что для правильной работы Unicode 5.6 вам приходилось делать уродливые хаки.

Недавно 5.10.1 внесла несколько несовместимых изменений в smart-match. К счастью, они были введены в 5.10.0, так что это не имеет большого значения. История о том, что Perl 6 представил концепцию интеллектуального сопоставления, была перенесена в версию Perl 5 для разработки. Прошло время, и идея интеллектуального сопоставления в Perl 6 изменилась. Никто не сказал парням Perl 5, и он вышел в 5.10.0 без изменений. Ларри Уолл заметил и сделал то же самое, что и OMG, да, это НЕПРАВИЛЬНО !!! Новая версия Perl 6 выглядела значительно лучше, и 5.10.1 исправила ее.

12 голосов
/ 06 декабря 2009

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

11 голосов
/ 06 декабря 2009

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

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

Двоичная несовместимость между основными выпусками (5.x) встречается часто, но обычно это просто означает, что любые расширения XS необходимо перекомпилировать.

Полный список слишком длинный, чтобы перечислять его здесь. Вы можете получить его, проверив раздел «Несовместимые изменения» в истории .

каждой версии.
5 голосов
/ 07 декабря 2009

ОТО, есть некоторые дикие особенности, начиная с Perl 1, которые все еще работают. Например, что это печатает?

%foo = (foo => 23);
print values foo

Правильно, 23. Почему? Потому что «ассоциативные массивы» не были первоклассными объектами в Perl 1. $foo{bar} работал, но не было %foo. Я действительно не знаю почему, даже страница руководства Perl 1 признает, что это бородавка. Поэтому для совместимости с Perl 1 вы можете получить доступ к глобальному хешу без использования %, возможно, если ваша клавиатура сломана или Apple решит, что никто не использует символ %.

chdir имеет некоторые странности. chdir() без аргументов перенесет вас в ваш домашний каталог, повторяя поведение оболочки cd. К сожалению, chdir undef и chdir "" затруднят обнаружение ошибок вокруг chdir. К счастью, это поведение устарело. Я должен убедиться, что он умрет в 5.14.

$[ все еще рядом и остается неутвержденным, но "крайне обескураженным". Это меняет первый индекс массива, поэтому если вы такой же человек, как я, и можете считать от 1, вы можете сделать:

$[ = 1;
@foo = qw(foo bar baz);
print $foo[2];   # prints bar

Perl 5 изменил его на файловую область, так как в противном случае это было перетаскивание производительности и отличный источник CrAzY.

3 голосов
/ 10 декабря 2009

У меня были некоторые странные ошибки, когда Perl4 и Perl5 оценивали левую и правую стороны задания в другом порядке, цитируя ловушки Perl для неосторожных :

LHS против RHS любого оператора присваивания. LHS оценивается сначала в perl4, затем в perl5; это может повлиять на связь между побочными эффектами в подвыражениях.

@arr = ( 'left', 'right' );
$a{shift @arr} = shift @arr;
print join( ' ', keys %a );
# perl4 prints: left
# perl5 prints: right

О некоторых новых и, возможно, несовместимых вещах см. FAQ между Perl4 и Perl5.

...