Какие конкретные примеры обратной несовместимости в версиях Perl?

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

За эти 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, обновления регулярных выражений, оператор smart match)

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

Вопрос:

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

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

5 ответов

Решение

Одной из самых больших преднамеренных несовместимостей является интерполяция массивов, которая изменилась между 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 исправили ее.

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

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

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

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

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

ОТО, есть некоторые дикие особенности, начиная с 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.

У меня были некоторые странные ошибки, когда 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.

Другие вопросы по тегам