2009-05-18 4 views

risposta

47

base ha provato a fare troppe cose — gestendo automaticamente i moduli di caricamento ma consentendo anche di stabilire l'ereditarietà dalle classi già caricate (possibilmente da un file il cui nome non era basato sul nome del modulo). Per fare in modo che funzionasse, ci sono stati degli hackery che hanno causato risultati sorprendenti in alcuni casi. Anziché interrompere la compatibilità con le versioni precedenti, è stato introdotto un nuovo pragma di sostituzione parent con semantica più pulita.

parent sarà un modulo principale a partire da 5.10.1.

Aggiornamento: dimenticato che base gestisce fields (se si utilizza il pragma fields), che parent non fa.

+21

Inoltre, confrontare perl -wE'say richiede base 'a perl -wE'say require parent' – ysth

34

, armati con il extra po 'di informazioni da ysth, sono stato in grado di vedere le differenze nei documenti:

Il base pragma fa le seguenti cose:

  • aggiunge il pacchetto chiamato a @ISA
  • carica il modulo con lo stesso nome del pacchetto denominato utilizzando require (a meno che non rilevi che il pacchetto è già stato caricato)
  • non avrà esito negativo se un modulo con th e stesso nome del pacchetto non esiste
  • trafile se non ci sono simboli nel pacchetto chiamato
  • se $VERSION non esiste nel pacchetto chiamato, base imposta per "-1, set by base.pm"
  • inizializza la fields del pacchetto chiamato se esistono
  • non chiama la funzione di importazione del pacchetto chiamato

il parent pragma fa le seguenti cose:

  • aggiunge il pacchetto chiamato a @ISA
  • carica il modulo con lo stesso nome del pacchetto chiamato utilizzando require
  • accetta un'opzione che dice di non morire se un modulo con lo stesso nome del pacchetto doesn' Esistono
+4

Quasi. L'opzione norequire dice semplicemente di non eseguire la richiesta (quindi la classe deve essere già caricata). Ciò significa che non deve intrappolare gli errori e decidere se debbano essere soppressi o meno. – ysth