Storia della domanda:
In Perl, lo spazio dei nomi è il principale modo per isolare variabili e funzioni tra diverse parti del programma. Con la direttiva package si creano aree indipendenti, ognuna delle quali ottiene il proprio insieme di variabili globali e funzioni. Questo consente di sviluppare progetti multi-file senza conflitti di nomi.
Problema:
Un uso improprio della visibilità (scoping), la mescolanza di variabili lessicali e di pacchetto, o un errato funzionamento dello spazio dei nomi "main" spesso porta a problemi: apparizione di variabili inaspettate, sovrascrittura di funzioni, bug non evidenti in tasse e test.
Soluzione:
package SomeName;.my) sono visibili solo all'interno del blocco, mentre quelle globali (our, precedentemente use vars) sono visibili in tutto il pacchetto.AnotherPackage::some_function().Esempio di codice:
package MyApp::Utils; our $global_var = 10; sub do_something { return $global_var + 1; } package main; print MyApp::Utils::do_something(); # 11
Caratteristiche chiave:
:: per accedere a risorse esterne.main è lo spazio globale standard di default per gli script.Qual è la differenza tra my, our e local nei pacchetti?
my — solo nel blocco lessicale corrente.our — dichiara una variabile globale del pacchetto, ma la rende disponibile come riferimento lessicale nel blocco.local — sovrascrive temporaneamente il valore globale della variabile del pacchetto per la durata del blocco.Si può chiamare una funzione senza specificare esplicitamente il pacchetto?
Sì, se la funzione è esportata nel pacchetto corrente tramite il modulo Exporter e use, altrimenti — solo tramite nome completo.
Si possono dichiarare più package in un file?
Sì, ma è difficile da comprendere — dopo ogni package tutte le ulteriori dichiarazioni si riferiscono a un nuovo spazio dei nomi. È meglio usare file separati per ogni pacchetto.
In uno script di squadra sono stati utilizzati più package di seguito, all'interno di un unico file; le variabili si confondevano, a volte lessicali, a volte globali.
Pro:
Contro:
Ogni package è stato spostato in un proprio modulo separato, le funzioni sono state esportate esplicitamente.
Pro:
Contro: