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

Каковы некоторые конкретные примеры отстающих несовместимостей в версиях 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)?

Пожалуйста, при необходимости укажите ссылки и примеры кода.

4b9b3361

Ответ 1

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

my @example = qw(1 2 3);
print "[email protected]";

В Perl 4, который будет:

[email protected]

В 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 Артур Бергман побежал с этим и использовал его для создания ithreads. Поскольку множественность эмулирует отдельный процесс, по умолчанию данные не разделяются. Только общие данные, которые вы говорите, являются общими. Это делает их более безопасными для использования, хотя это потребовало много времени, прежде чем ithreads были стабильными. Такие люди, как Элизабет Маттизсен и Джерри Хедден, сделали это.

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

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

В последнее время 5.10.1 сделал кучу несовместимых изменений в smart-match. К счастью, они были представлены в 5.10.0, так что это не очень важно. История Perl 6 представила концепцию смарт-матча, и она была обращена к версии Perl версии 5. Время прошло, и идея интеллектуального сопоставления Perl 6 изменилась. Никто не сказал парням Perl 5, и он вышел в 5.10.0 без изменений. Ларри Уолл заметил и сделал эквивалент OMG YER DOIN IT WRONG!!! Новая версия Perl 6 была значительно лучше, и поэтому 5.10.1 зафиксировал его.

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

%foo = (foo => 23);
print values foo
Правильно, 23. Почему? Поскольку "ассоциативные массивы" не были первоклассными объектами в Perl 1. $foo{bar} работал, но не было %foo. Я действительно не знаю, почему даже страница Perl 1 man признает, что это бородаво. Поэтому для совместимости с 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.

Ответ 5

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