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

определение неявно, которое тип параметра метод ожидает

На самом деле, этот частично возможен (по крайней мере, в PHP5) - можно определить тип для параметров массива и параметры объекта для функций и методов, хотя Вы являетесь неудачливыми в случае скалярных типов.

class Bar
{
    public function __construct(array $Parameters, Bar $AnotherBar){}
}

Кроме этого и волшебных методов Allain упомянул, я также нахожу интерфейсы обеспеченными SPL (Стандартная библиотека PHP) необходимый - можно реализовать необходимые методы в классе, например, мне особенно нравятся интерфейсы ArrayAccess и Итератора, которые позволяют использовать объект как ассоциативный массив или выполнять итерации по нему точно так же, как любой простой массив.

12
задан knorv 13 December 2009 в 22:47
поделиться

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

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

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

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

■ Unicode обычно приходилось переписывать в 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 YER DOIN IT WRONG !!! Новая версия Perl 6 выглядела значительно лучше, поэтому в 5.10.1 она была исправлена.

■ Unicode обычно приходилось переписывать в 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 YER DOIN IT WRONG !!! Новая версия Perl 6 выглядела значительно лучше, поэтому в 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 она была исправлена.

Я внес кучу несовместимых изменений в 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 она была исправлена.

Ребятам из Perl 5 никто не сказал, и он вышел в 5.10.0 без изменений. Ларри Уолл заметил и сделал эквивалент OMG YER DOIN IT WRONG !!! Новая версия Perl 6 выглядела значительно лучше, поэтому в 5.10.1 она была исправлена.

Ребятам из Perl 5 никто не сказал, и он вышел в 5.10.0 без изменений. Ларри Уолл заметил и сделал эквивалент OMG YER DOIN IT WRONG !!! Новая версия Perl 6 выглядела значительно лучше, поэтому в 5.10.1 она была исправлена.

14
ответ дан 2 December 2019 в 03:22
поделиться

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

12
ответ дан 2 December 2019 в 03:22
поделиться

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

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

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

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

11
ответ дан 2 December 2019 в 03:22
поделиться

OTOH есть некоторые дикие особенности, восходящие к 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.

5
ответ дан 2 December 2019 в 03:22
поделиться

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

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

 @arr = ('влево', 'вправо');
$ a {shift @arr} = shift @arr;
print join ('', ключи% a);
# perl4 печатает: слева
# perl5 печатает: правильно

Для получения информации о некоторых новых и, возможно, несовместимых материалах, см. FAQ между Perl4 и Perl5.

3
ответ дан 2 December 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: