2009-05-18 2 views

ответ

47

base пытался сделать слишком много вещей — автоматически обрабатывал модули загрузки, но также позволял устанавливать наследование из уже загруженных классов (возможно, из файла, имя которого не было основано на имени модуля). Чтобы заставить его работать, в некоторых случаях произошел хакерство, которое вызвало неожиданные результаты. Вместо того, чтобы отменить обратную совместимость, появилась новая, заменяющая прагма parent с более чистой семантикой.

parent будет основным модулем по состоянию на 5.10.1.

Update: забыл, что base обрабатывает fields (если вы используете fields прагму), который parent не делает.

+21

Кроме того, сравните perl -wE'say require base 'to perl -wEsa require parent' – ysth

34

Вооруженная дополнительный бит информации из ysth, я был в состоянии увидеть различия в документации:

base Прагма делает следующие вещи:

  • добавляет указанный пакет в @ISA
  • загружает модуль с тем же именем, что и именованный пакет, с использованием require (если он не обнаружит, что пакет уже загружен)
  • не будет работать, если модуль с th е же имя пакета не существует
  • плашки, если нет символов в имени пакета
  • если $VERSION не существует в имени пакета, база устанавливает его "-1, set by base.pm"
  • инициализирует fields названного пакета если они существуют
  • не вызывает функцию импорта названного пакета

parent прагма делает следующие вещи:

  • добавляет указанный пакет в @ISA
  • загружает модуль с тем же именем, что и с именем пакета, используя require
  • принимает вариант, который говорит ему, чтобы не умереть, если модуль с тем же именем, что и пакет Безразлично» t существует
+4

Почти. Опция norequire просто говорит ей не выполнять require (поэтому класс уже должен быть загружен). Это означает, что он не должен ловить ошибки и решать, следует ли их подавлять или нет. – ysth