POD2-IT

 view release on metacpan or  search on metacpan

IT/perlsub.pod  view on Meta::CPAN

    sub PI ()		{ 4 * atan2 1, 1 }	# Buona come viene,
						# ed e` pure espansa in linea!
    sub ST_DEV ()	{ 0 }
    sub ST_INO ()	{ 1 }

    sub FLAG_PIPPO ()    { 1 << 8 }
    sub FLAG_PLUTO ()    { 1 << 9 }
    sub FLAG_MASCHERA () { FLAG_PIPPO | FLAG_PLUTO }

    sub OPZ_TOPO () { not (0x1B58 & FLAG_MASCHERA) }

    sub N () { int(OPZ_TOPO) / 3 }

    sub PIPPO_IMPOSTATO () { 1 if FLAG_MASCHERA & FLAG_PIPPO }

Fate attenzione che quelle che segono non saranno espanse; poichE<eacute>
contengono ambiti di visibilitE<agrave> interni, la semplificazione
delle costanti non le riduce ad una singola costante:

   sub pippo_set () { if (FLAG_MASCHERA & FLAG_PIPPO) { 1 } }

   sub baz_val () {
      if (OPZ_TOPO) {
         return 23;
      }
      else {
         return 42;
      }
   }

Se ridefinite una subrouinte che risultava espandibile, riceverete un
I<warning> obbligatorio. (Potete anche utilizzare questo I<warning> per sapere
se una particolare subroutine E<egrave> considerata costante o no). Il
I<warning> E<egrave> considerato importante abbastanza da non essere opzionale,
perchE<eacute> le chiamate alla funzione compilate in precedenza utilizzeranno
ancora la vecchia definizione della funzione. Se avete bisogno di ridefinire
la subroutine, dovete assicurarvi che non sia espansa in linea, o eliminando
il prototipo C<()> (che ne cambia il comportamento, quindi attenzione) o
aggirando il meccanismo di espansione in qualche altro modo, come

   sub non_espansa_in_linea () {
      23 if $];
   }

=head2 Ridefinire le Funzioni Native
X<built-in> X<nativa> X<ridefinire> X<CORE> X<CORE::GLOBAL>

Molte funzioni native possono essere ridefinite, sebbene questo
approccio debba essere riservato per poche e ben dimostrate
occasioni. Tipicamente questo approccio potrebbe essere utilizzato
da un modulo che tenti di emulare una funzionalitE<agrave> nativa su un
sistema non-Unix.

La ridefinizione puE<ograve> essere effettuata solo importando il nome da un
modulo in fase di compilazione -- la pre-dichiarazione ordinaria
non E<egrave> sufficiente. In ogni caso, il pragma C<use subs> vi consente,
in effetti, di predichiarare le subroutine attraverso la sintassi
di importazione usuale, e questi nomi possono poi ridefinire
quelli nativi:

   use subs 'chdir', 'chroot', 'chmod', 'chown';
   chdir $daqualcheparte;
   sub chdir { ... }

Per riferirsi senza ambiguitE<agrave> alla forma nativa, occorre precedere
il nome della funzione con il qualificatore di pacchetto speciale
C<CORE::>. Ad esempio, C<CORE::open()> si riferisce sempre alla
funzione nativa C<open()>, anche se il pacchetto corrente ha
importato qualche altra subroutine chiamata C<&open()> da qualche
altra parte. Anche se sembra una normale chiamata a funzione, non
lo E<egrave>: non potete prendervi un riferimento, come l'espressione
scorretta C<\&CORE::open> puE<ograve> sembrare produrre.

I moduli di libreria non dovrebbero, in generale, esportare nomi
di funzioni native come C<open> o C<chdir> come parte della loro
lista C<@EXPORT> di default, perchE<eacute> potrebbero andarsi ad infilare
nello spazio dei nomi di qualcun altro e cambiar loro la semantica
in maniera inaspettata. Se il modulo, invece, include questi nomi
all'interno di C<@EXPORT_OK> sarE<agrave> allora possibile per un utente
importarli esplicitamente, ma non implicitamente. Ossia, potrebbero
scrivere:

    use Module 'open';

e verrebbe importata la ridefinizione di C<open>. Ma se
scrivessero

    use Module;

avrebbero i nomi importati per default senza le ridefinizioni.

Il meccanismo di ridefinizione delle funzioni native viene ristretto,
abbastanza intenzionalmente, al pacchetto che richiede l'importazione.
Esiste perE<ograve> un secondo metodo che puE<ograve> essere talvolta
utilizzato quando volete ridefinire una funzione nativa in tutto il programma,
senza preoccuparvi dei limiti degli spazi dei nomi. Questo risultato puE<ograve>
essere ottenuto importando una subroutine nello spazio dei nomi speciale
C<CORE::GLOBAL::>. Quello che segue E<egrave> un esempio che rimpiazza
l'operatore C<glob> senza troppo pudore, con qualcosa che gestisce
le espressioni regolari:

   package REGlob;
   require Exporter;
   @ISA = 'Exporter';
   @EXPORT_OK = 'glob';

   sub import {
      my $pkg = shift;
      return unless @_;
      my $sim = shift;
      my $dove = ($sim =~ s/^GLOBAL_// ? 'CORE::GLOBAL' : caller(0));
      $pkg->export($dove, $sim, @_);
   }

   sub glob {
      my $pat = shift;
      my @preso;
      local *D;
      if (opendir D, '.') { 
         @preso = grep /$pat/, readdir D; 
         closedir D;   



( run in 0.568 second using v1.01-cache-2.11-cpan-5511b514fd6 )