Newsgroup: it.comp.lang.perl
Titolo: Come creare moduli ?

Salve a tutti,
mi sto avvicinando alla programmazione in perl.
Ho letto le faq su 
perl.it
 e gli articoli ma non ho trovato risposta al 
mio certamente semplice problema.
Voglio creare una classe e richiamare un suo metodo all'interno di un 
modulo principale.
Il sorgente, salvato in un unico file 
prova.pl
, incollato in fondo a 
questo post funziona perfettamente.
Il problema č che io vorrei separare il package Persona dal package 
principale includendo Persona con "use Persona".
Ho provato in vari modi ma non funziona mai.
Ho creato un file Persona.pl e un file 
prova.pl
 ma lanciando 
prova.pl
 mi 
dice che non trova Persona.pm.
Allora l'ho rinominato in Persona.pm ma che non lo trova in /etc/perl, 
allora l'ho spostato in /etc/perl ma anche cosě mi dice che il modulo 
Persona non ha riportato un true value. L'errore esatto č:
platone:/etc/perl# perl 
prova.pl
Persona.pm did not return a true value at 
prova.pl
 line 1.
BEGIN failed--compilation aborted at 
prova.pl
 line 1.
Qualcuno sa aiutarmi?
Grazie
---Cut---
package Persona;
sub new {
         my $this={};
         $this->{NOME} = undef;
         $this->{COGNOME} = undef;
         $this->{ETA} = undef;
         bless $this;
         return $this;
}
sub set_Dati {
         my $this = shift;
         $this->{NOME} = shift;
         $this->{COGNOME} = shift;
         $this->{ETA} = shift;
}
sub get_eta_persona {
         my $this = shift;
         return $this->{ETA};
}
use Persona;
$pers = Persona->new();
$pers->set_Dati("Pinco", "Pallino", 30);
print "La persona appena creata ha", $pers->get_eta_persona(), "anni\n";

 BEGIN failed--compilation aborted at 
prova.pl
 line 1.
Di solito basta aggiungere la seguente linea di codice in fondo al modulo:
1;
  Raffaello

 1;
Aggiungo alla discussione questi link:
http://apress.com/free/
dove si può scaricare gratutitamente il libro "Writing Perl Modules for
CPAN"
http://www.perl.it/documenti/faq/view.html?pag=7&faq=9
la faq sui moduli dove vengono citati tra gli altri: perlmod,
perlmodlib, perlmodstyle perlnewmod, ottenibili con perldoc nomemodulo
in locale oppure su 
perldoc.perl.org

 1;
Funziona!!
Grazie mille.
Non avevo trovato nulla di simile su tutto il materiale che ho recuperato.
Ho anche preso alla biblioteca del poli il testo di Wall e Christiansen 
ma questo dettaglio non l'avevo trovato.
A questo punto colgo l'occasione per chiederti(vi) in che modo posso 
modificare il percorso dove l'interprete cerca i moduli (che in questo 
caso mi pare sia /etc/perl); non posso mettere un modulo (che di fatto è 
una classe) nello stesso percorso del modulo principale??
Grazie ancora

 Aggiungo alla discussione questi link:
ti ringrazio...
scarico subito

 classe) nello stesso percorso del modulo principale??
C'e' la variabile @INC che dovrebbe fare al caso tuo.
http://www.perl.com/doc/manual/html/pod/perlvar.html
  Raffaello

 
http://www.perl.com/doc/manual/html/pod/perlvar.html
Imho č piů comodo e conveniente usare il pragma lib:
http://perldoc.perl.org/lib.html
my 2 cents,
-- 
.           .  | 
| , ,-. ,-. |  | "In girum imus nocte et consumimur igni."
|<  |   ,-| |  |                               -- Virgilio
' ` '   `-^ `' |

 modulo principale. [...]
Attenzione. In un altro ramo del thread ti hanno spiegato
come far funzionare il modulo, ma nel codice che hai mostrato
c'e` un altro errore che non si e` ancora presentato ma e` 
potenzialmente molto piu` insidioso. Il costruttore che hai
scritto e` il seguente:
  sub new {
    my $this={};
    $this->{NOME} = undef;
    $this->{COGNOME} = undef;
    $this->{ETA} = undef;
    bless $this;
    return $this;
  }
In esso usi la funzione bless() passandole un solo parametro.
La documentazione [1] dice che se ometti il nome della classe
allora viene usato il package corrente. Nel tuo caso e` Persona,
ed e` quello che intendi. Le cose pero` non vanno bene se 
scrivi classi derivate da Persona. Mi spiego meglio con un 
esempio:
    --------------------------------
    package Foo;
    sub new 
    {
        my $this = {};
        bless $this;
        return $this;
    }
    package Bar;
    use base qw/ Foo /;
    package main;
    my $obj = Bar->new();
    print ref( $obj );
    --------------------------------
Il costruttore e` analogo al tuo. La prima riga di main
costruisce un oggetto usando il costruttore di Bar, ma poi 
quando chiediamo il "nome di battesimo" dell'oggetto, 
otteniamo 'Foo'. Perche`? Perche` Bar si rivolge al package
Foo per sapere cosa fare quando qualcuno gli manda il messaggio
"new", e dentro a new() c'e` scritto di usare per bless()
il nome del package corrente. Che e` Foo, non Bar. Per ovviare 
al problema il costruttore deve diventare:
    sub new 
    {
        my $class = shift;
        my $this = {};
        bless $this, $class;
        return $this;
    }
ciao,
S.
[1] 
http://www.perl.it/documenti/perlfunc/view.html?func=bless
-- 
Stefano Rodighiero      |  
http://larsen.perlmonk.org/blog
mailto:
lar...@perl.it
   |  Italian Perl Mongers: 
http://www.perl.it

 potenzialmente molto piu` insidioso. Il costruttore che hai
Grazie della precisazione, ne farò tesoro.