File: perl.html

package info (click to toggle)
pj-9805 1.0-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 396 kB
  • ctags: 24
  • sloc: makefile: 39; sh: 18
file content (553 lines) | stat: -rw-r--r-- 19,637 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Cos'&egrave; il PERL</TITLE>
</HEAD>

<BODY LINK="#0000ff" VLINK="#0000ff" ALINK="#0000ff" BGCOLOR="#ffffff">

<TABLE BORDER=0 CELLPADDING=0 WIDTH=100%>
<TR>

<TD ALIGN=left BGCOLOR="#ffffff">
<A HREF="gimp.html">
<IMG ALT="[precedente]" SRC="pj_images/a_left.gif" BORDER=0></A>
</TD>

<TD ALIGN=center BGCOLOR="#cccccc">
<FONT COLOR="#00ff00">
<A HREF="gimp.html">GIMP</A>
- <A HREF="index.html">Copertina</A> -
<A HREF="linux-edicola.html">CDROM-edicola</A>
</FONT>
</TD>

<TD ALIGN=right BGCOLOR="#ffffff">
<A HREF="linux-edicola.html">
<IMG ALT="[successivo]" SRC="pj_images/a_right.gif" BORDER=0></A>
</TD>

</TR>
</TABLE>


<P ALIGN=right>
<FONT SIZE=+3 COLOR="#ff0000">
<EM>Articoli</EM>
</FONT>
<HR>

<P ALIGN=center>
<FONT SIZE=+3 COLOR="#0000FF">Cos'&egrave; il PERL
</FONT>
</P>


<H2>Cosa voglio fare in questi articoli</H2>

<P>Questo &egrave; il primo di una serie di articoli che non vogliono essere
assolutamente un corso sul Perl, ma solo uno stimolo per far vedere quanto
questo linguaggio possa essere utile nella ``vita di tutti i giorni''; per
un corso intensivo del linguaggio si rimanda alla bibliografia che verr&agrave; via
via fornita.</P>

<H2>Un po' di storia del PERL</H2>

<P>Prima della storia del PERL vediamo di capire cosa significa PERL!!!

<P>P.E.R.L. &egrave; l'acronimo di <EM>Practical Extraction and Report
Language</EM> o se si preferisce <EM>Pathologically Eclectic Rubbish
Lister</EM>; non si sa quale delle due definizioni sia la pi&ugrave; esatta:
entrambe sono state dettate direttamente da Larry Wall, autore, mantenitore,
implementatore di questo linguaggio.

<P>Larry Wall cre&ograve; il PERL quando tentava di produrre alcuni report
da una serie di file; trovato che <EM>awk</EM> non soddisfava completamente
le sue richieste decise di risolvere il problema scrivendo un tool <I>general-purpose</I>.

<P>Oggi il PERL &egrave; diventato un linguaggio di programmazione disponibile
su ogni implementazione di Unix, (ma lo si pu&ograve; trovare anche su
sistemi diversi dagli Unix quali NT, OS/2 ecc..) la versione attuale &egrave;
la 5.004 e lentamente sta crescendo e si sta perfezionando sempre pi&ugrave;.


<H2>A cosa serve PERL</H2>

<P>Per sapere cosa si pu&ograve; fare con Perl basta fare un bel <TT>man perl</TT>
e leggere direttamente quanto scrive Wall: <I>"Il Perl &egrave; un linguaggio
interpretato ottimizzato per la scansione di file di testo arbitrari, l'estrazione
di informazioni da questi file di testo e la stampa di report basati su
queste informazioni. &Egrave; anche un buon linguaggio per molti lavori
di manutenzione di sistema. Il linguaggio &egrave; pesato per essere pratico
(facile da usare, efficiente e completo) e non per essere bello (piccolo,
elegante, minimale)", </I>chi ha gi&agrave; una minima esperienza di Un*x
pu&ograve; pensare che il Perl non faccia altro che fare tutto quello che
pu&ograve; fare una semplicissima shell di sistema: questo per&ograve;
sarebbe un primo errore: proviamo infatti a pensare a quante sono le shell
normalmente presenti in un sistema Un*x (csh, tcsh, zsh, bash...) e quanti
linguaggi di script si dovrebbero imparare, in pratica uno per ogni shell.
Con Perl un programma scritto su un sistema, ad esempio Linux, funziona
su ogni sistema che faccia girare Perl senza essere minimamente modificato.

<P>Perl &egrave; molto pi&ugrave; conciso rispetto agli script di shell
ed &egrave; molto pi&ugrave; sicuro. Perl &egrave; inoltre il linguaggio
di programmazione pi&ugrave; usato per lo sviluppo di applicazioni CGI,
ma &egrave; anche molto utile per la scrittura di applicazioni ftp, news,
mail, accesso a database etc...

<P>Proprio per la sua propensione per la scrittura di programmi CGI Perl
sta diventando sempre pi&ugrave; uno strumento utile al Webmaster.

<H2>Il linguaggio visto da vicino</H2>

<P>Sintatticamente il Perl &egrave; molto simile al C, anche se naturalmente
ci sono delle differenze.

<P>Il Perl &egrave; un linguaggio interpretato, non &egrave; particolarmente
semplice ma &egrave; anche dotato di una grande potenza e di una grande
logicit&agrave;. La definizione di linguaggio interpretato &egrave; per&ograve;
un po' limitativa: in realt&agrave; uno script prima di essere eseguito
viene letto nella sua interezza, ne viene controllata la sintassi, viene
compilato e quindi eseguito; alla fine dell' esecuzione il "compilato"
viene rimosso dalla memoria. Spesso il Perl viene utilizzato per la creazione
di prototipi di programmi che poi vengono sviluppati in altri linguaggi
di programmazione, ed &egrave; estremamente comodo per la scrittura di
programmi "usa e getta". Nella versione 5.xxx alla tradizionale programmazione
procedurale sono stati aggiunti una pi&ugrave; moderna programmazione orientata
agli oggetti ed un supporto alla modularit&agrave;.

<P>Non sono ancora stati creati compilatori Perl, probabilmente perch&eacute;
non se ne sente una reale esigenza.

<P><B>Un colpo d'occhio e capisci che...</B>

<P>Le variabili non devono essere dichiarate e la conversione fra tipi
di variabile diverse avviene in modo automatico: &egrave; infatti possibile
assegnare, ad esempio, un intero ad una stringa o viceversa senza nemmeno
ricevere un ``warning'' dall'interprete-compilatore.

<P>Le variabili che possiamo trovare sono di 3 tipi:
<UL>
<LI>scalari</LI>
<LI>array di scalari</LI>
<LI>array associativi di scalari (o ``hash'')</LI>
</UL>

<P>Per dati scalari si intendono:
<UL>
<LI>numeri di qualsiasi tipo, visto che per il Perl internamente i numeri sono
tutti trattati come floating point in doppia precisione, motivo per il
quale &egrave; possibile effettuare assegnamenti anche da un floating point
ad un intero senza ottenere i famosi <I>warning</I> del C;</LI>
<LI>stringhe.</LI>
</UL>

<P>Le variabili di tipo scalare sono identificati da nomi che iniziano
<B>obbligatoriamente</B> con il carattere speciale "$" e possono avere nomi
di lunghezza variabile:
<CENTER><PRE>$ma_guarda_come_e_lungo_il_nome_di_questa_variabile_perl</PRE></CENTER>
naturalmente non devono essere assolutamente inseriti spazi nel nome della
variabile.

<P><B>Variabili di tipo numerico</B>

<P>Tenendo presente che internamente il Perl considera i numeri come se
fossero tutti nello stesso formato, ecco alcune semplici dichiarazioni
di variabili numeriche:

<P><I><U>Variabili numeriche di tipo floating point</U></I>
<PRE>2.25</PRE>

<PRE>1.39e55 # 1.39x10^55</PRE>

<PRE>1.39E55 # idem come sopra</PRE>

<PRE>-4.3e22 # -4.3x10^22</PRE>
<I><U>Variabili numeriche di tipo intero</U></I>
<PRE>199</PRE>

<PRE>1436</PRE>

<PRE>-22450</PRE>

<PRE>2849</PRE>
Possono essere dichiarate variabili di tipo ottale facendo precedere il
valore numerico per 0, oppure si possono dichiarare variabili di tipo esadecimale
facendo precedere il valore numerico da 0x:
<PRE>0xff&nbsp;&nbsp;&nbsp; # Dichiara il valore esadecimale FF, corrispondente al valore 255 in decimale</PRE>

<PRE>0377&nbsp;&nbsp;&nbsp; # Dichiara il valore ottale 377, corrispondente al valore 255 in decimale</PRE>
<B>Variabili di tipo stringa</B>

<P>Non sono altro che normali sequenze di caratteri e possono essere di
due tipi, <I>singled-quoted</I> o <I>double-quoted</I>: vediamone qualche
esempio:
<PRE>'ciao'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # stringa singled-quoted che corrisponde a 5 caratteri c, i, a, o</PRE>

<PRE>'l'apostrofo'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # stringa singled-quoted che corrisponde a l,',a,p,o,s,t,r,o,f,o</PRE>

<PRE>"Linux the choice of a\nGNU generation"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Linux the choice of a GNU &lt;newline> generation</PRE>

<PRE>"Linux" x 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # corrisponde alla stringa "LinuxLinuxLinuxLinuxLinux"</PRE>

<CENTER>Interessanti, e diversi da quelli del C, sono gli operatori da
usarsi con le stringhe, li vediamo riassunti nella tabella seguente:</CENTER>

<CENTER>&nbsp;</CENTER>
&nbsp;
<CENTER><TABLE BORDER=2 COLS=2 WIDTH="100%" NOSAVE >
<TR>
<TD><B>Tipo di comparazione</B></TD>

<TD><B>Simbolo</B></TD>
</TR>

<TR>
<TD>Uguale&nbsp;</TD>

<TD>eq</TD>
</TR>

<TR>
<TD>Non uguale&nbsp;</TD>

<TD>ne</TD>
</TR>

<TR>
<TD>Minore</TD>

<TD>lt</TD>
</TR>

<TR>
<TD>Maggiore</TD>

<TD>gt</TD>
</TR>

<TR>
<TD>Minore uguale</TD>

<TD>le</TD>
</TR>

<TR>
<TD>Maggiore uguale&nbsp;</TD>

<TD>ge</TD>
</TR>
</TABLE></CENTER>
&nbsp;

<P><B>Array di scalari</B>

<P>Nulla in particolare da dire riguardo agli <B>array</B> di scalari,
il cui concetto &egrave; simile a quello degli altri linguaggi di programmazione;
il nome di un array deve iniziare con il carattere @ (come in @nome_della_variabile).
<BR>Per accedere ad un elemento di un array di scalari basta utilizzare
la sintassi $_nome_del_array[indice]; quindi per accedere al 5 elemento
dell'array @pluto si dovr&agrave; utilizzare: $pluto[4], tendendo conto
che il primo elemento di un array ha indice 0.

<P>&nbsp;

<P><B>Array associativi</B>

<P>Meritano una breve spiegazione gli <B>array associativi</B>, nei quali
si pu&ograve; accedere ad ogni dato attraverso un indice: &egrave; possibile
rappresentare, in prima istanza, un array associativo come una tabella
nella quale la prima colanna rappresenta le chiavi di accesso ai dati,
mentre la seconda colonna rappresenta il dato stesso. Vediamo una tabella
e proviamo a vedere come tradurre il tutto in Perl:
<CENTER><TABLE BORDER=2 >
<TR>
<TD>1</TD>

<TD>GNU/Linux</TD>
</TR>

<TR>
<TD>2</TD>

<TD>BeOS</TD>
</TR>

<TR>
<TD>3</TD>

<TD>Windows NT</TD>
</TR>
</TABLE></CENTER>
&nbsp;Il nome di un array associativo &egrave; contrassegnato dal carattere
speciale % (%nome_della_variabile).

<P>Ecco come tradurre la struttura dati in Perl:
<PRE>$tabella_so{1}= "GNU/Linux";</PRE>

<PRE>$tabella_so{2}= "BeOS";</PRE>

<PRE>$tabella_so{3}= "Windows NT";</PRE>
Per accedere all'elemento con chiave 2 (BeOS) &egrave; sufficiente scrivere:
<PRE>print $tabella_so{2}&nbsp;&nbsp;&nbsp; # Scrive il valore BeOS</PRE>
&Egrave; interessante vedere come pur dovendo riferirsi all'intero array
associativo con %nome_della_variabile, in questo caso %tabella_so, per
riferirsi ad un singolo elemento dell'array si debba usare la sintassi
$nome_del_array_associativo{elemento}.&nbsp;

<P><B>Espressioni regolari in Perl</B>

<P>Proprio perch&eacute; il Perl &egrave; nato per essere un linguaggio
che estraesse dati da file e li presentasse in forma diversa, la sua potenza
nel trattare file di testo &egrave; realmente incredibile: ne sono un esempio
le <I>espressioni regolari</I>.

<P>Una <I>expressione regolare</I> &egrave; un pattern, un template, che
deve corrispondere ad una stringa; il concetto di espressione regolare
non &egrave; nuovo all'ambiente Un*x, programmi come Emacs, VI o grep usano
espressioni regolari: se vogliamo ad esempio trovare nel nostro filesystem
un file che contenga le lettere "unx" possiamo usare un comandino del genere:
<CENTER><PRE>find | grep unx</PRE></CENTER>
unx non rappresenta altro che l'E.R. da passare a grep perch&eacute; lui
ne cerchi un corrispondente.

<P>Quante volte &egrave; capitato di trovarsi davanti ad una domanda alla
quale di doveva rispondere con un Y o un N, formulata nel seguente modo:
<PRE>Would you like to continue?</PRE>
Le risposte plausibili possono essere:
<OL>y

<P>Y

<P>yes

<P>Yes

<P>YES

<P>n

<P>N

<P>n

<P>No

<P>NO</OL>
10 risposte plausibili tutte da gestire: Perl semplifica il problema nel
seguente modo, attraverso l'uso delle E.R.:
<PRE>print "Continue?"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Scrive continue a video ma NON va a capo</PRE>

<PRE>if (&lt;STDIN> =~ /^[yY]/)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Controlla se la risposta inserita dall'utente nello standard input</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # inizia con una y o una Y</PRE>

<PRE>{</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # gestisce la risposta y</PRE>

<PRE>} else</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Gestisce la risposta n</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</PRE>
&nbsp;

<P>E il gioco &egrave; fatto, prima piccola magia del Perl. ;-)
<BR><B>Un'altra piccola magia: anfinger</B> Una delle macchine che mi trovo
ad amministrare &egrave; un server di posta elettronica di studenti di
un universit&agrave;; il nome degli studenti non compare nel loro <I>login
name</I>, e per cercare un utente con il cognome Rossi &egrave; necessario
utilizzare il comando finger. Per svariate ragioni il finger &egrave; stato
levato dalla macchina, anche per gli utenti che eseguono comandi da shell;
a questo scopo ho creato <I>A nice Finger</I> di cui segue il listato:
invocato con la sintassi indicata anfinger restituisce l'indirizzo di posta
elettronica dello studente che ha il nome dato sulla riga di comando:
<CENTER><TT>anfinger ignoti</TT></CENTER>


<P>Eccone il listato:
<BR>&nbsp;
<BR>&nbsp;
<CENTER><TABLE BORDER=2 COLS=1 WIDTH="100%" NOSAVE >
<TR>
<TD>
<PRE>1 #!/usr/bin/perl</PRE>

<PRE>#&nbsp;</PRE>

<PRE># ANFinger</PRE>

<PRE>##############################################################################</PRE>

<PRE># Variabili per le installazioni differenti e per le successive modifiche&nbsp;&nbsp;&nbsp; #</PRE>

<PRE>##############################################################################</PRE>

<PRE>2 $FILE_PASSWD=" /etc/passwd"; # questa variabile deve essere cambiata secondo le&nbsp;</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # impostazioni della macchina in cui viene usato&nbsp;</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ANFinger</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</PRE>

<PRE>3 $versione = "1.00";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # La versione attuale del programma</PRE>

<PRE>4 $notfound = 0 ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Inizializzo la variabile</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</PRE>

<PRE>5 if ($ARGV[0] eq "") {</PRE>

<PRE>6&nbsp;&nbsp; print "Utilizzare anfinger &lt;nome utente>\n";</PRE>

<PRE>7&nbsp;&nbsp; exit;</PRE>

<PRE>}</PRE>

<PRE>8 $nome =~ tr/A-Z/a-z/;</PRE>

<PRE>9 print "\n\nANFinger $versione by Corrado Ignoti\n";</PRE>

<PRE>10 print "Risultati della ricerca effettuata con la chiave $ARGV[0]\n\n";</PRE>

<PRE>11 open (password, $FILE_PASSWD); # accedo al file passwd</PRE>

<PRE>12 while ($name = &lt;password>) {</PRE>

<PRE>13&nbsp;&nbsp;&nbsp; chop ($name);</PRE>

<PRE>14&nbsp;&nbsp;&nbsp; @login = split (/:/, $name);</PRE>

<PRE>15&nbsp;&nbsp;&nbsp; $login[4] =~ tr/A-Z/a-z/;</PRE>

<PRE>16&nbsp;&nbsp;&nbsp; if ($login[4] =~ /$ARGV[0]/i) {</PRE>

<PRE>17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "$login[4], e-mail: $login[0]\@$ENV{HOST}.$ENV{DOMAIN}\n";</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $notfound = $notfound + 1;&nbsp;</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</PRE>

<PRE>&nbsp;}</PRE>

<PRE>18 close (password);</PRE>

<PRE>if ($notfound == 1) {</PRE>

<PRE>19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; die "Non ci sono utenti per la chiave specificata\n\n";</PRE>

<PRE>}</PRE>

<PRE>if ($notfound > 1) {</PRE>

<PRE>&nbsp;&nbsp;&nbsp;&nbsp; die "\n\nNon ci sono altri utenti per la chiave specificata\n\n";&nbsp;</PRE>

<PRE>}</PRE>
</TD>
</TR>
</TABLE></CENTER>
<B>Commentiamo brevemente il listato:</B>

<P>la <B>riga 1</B> dice alla shell che il listato seguente deve essere
interpretato attraverso il programma perl; nella <B>riga 5</B> troviamo
una cosa interessante: viene controllato se anfinger &egrave; stato invocato
senza argomenti sulla linea di comando, il funzionamento di ARGV &egrave;
simile a quello del C ( o meglio di Java), infatti $ARGV[0] (il primo elemento
dell'array @ARGV) &egrave; il primo argomento passato sulla riga di comando
dopo il nome del file.

<P>la <B>riga 8 </B>&egrave; un espressione regolare che trasforma il contenuto
della variabile $nome da maiuscolo a minuscolo, riassegnandolo alla variabile
$nome stessa

<P>la <B>riga 11 </B>accede al file /etc/passwd, mentre il ciclo while
alla <B>riga 12</B> scandisce sequenzialmente il file, l'istruzione alla
<B>riga 13</B>, cancella l'ultimo carattere di una stringa; la cosa interessante
&egrave; per&ograve; l'istruzione alla <B>riga 14</B>, con la quale si
forma l'array @login che contiene gli elementi di una riga del file passwd:
ogni campo dell'array contiene un elemento diverso del file; per suddividere
gli elementi si utilizza il carattere ``:'', infatti il file passwd &egrave;
cos&igrave; strutturato:
<BR>&nbsp;
<CENTER><PRE>nome:password:uid:gid:fullname:home/directory</PRE></CENTER>
l'array @login dopo l'operazione di split, risulter&agrave; formato da:

<P>$login[0] = nome
<BR>$login[1] = password
<BR>$login[2] =&nbsp; uid
<BR>.....
<BR>$login[4] = homedirectory

<P>la <B>riga 17</B> comunica i dati all'utente (si noti l'uso di \@ per
visualizzare il carattere ``@'' e $ENV{HOST}.$ENV{DOMAIN} per la visualizzazione
rispettivamente della variabile contenente il nome dell' host e del dominio).
<BR>&nbsp;
<H3>
Linux e il Perl</H3>
Inutile dire che qualsiasi distribuzione Linux, dalla pi&ugrave; comune
alla pi&ugrave; ``esotica'', contiene i pacchetti necessari per avere l'interprete
Perl funzionante sulla propria macchina.
<H3>
Per iniziare: libri e link sul Perl</H3>
<B>Learning Perl</B>
<BR><I>Randal L. Schwartz foreword by Larry Wall</I>
<BR>O'Reilly and Associates, Inc. 1994
<BR>ISBN 1-56592-042-2
<BR>Il libro scritto direttamente dall'autore del linguaggio, ottimo punto
di partenza.
<BR><B><A HREF="http://www.Perl.com">www.Perl.com</A></B>
<BR>Un buon punto di partenza per trovare materiale ed informazioni sul
Perl
<BR><B>Programming Perl, 2nd Edition</B>
<BR><I>Larry Wall, Tom Christiansen &amp; Randal L. Schwartz</I>
<BR>O'Reilly and Associates, Inc 1996
<BR>ISBN 1-56592-149-6
<BR>Per approfondire la propria conoscenza del Perl
<BR><B>Perl by example</B>
<BR><I>Ellie Quigley</I>
<BR>Prentice Hall
<BR>copre con esempi molto chiari tutte le parti del perl (compresi OOP,
CGI
<BR>ed interazione con il sistema), ed ha un CDROM con tutti i porting
per i
<BR>vari sistemi operativi e dei programmi di esempio.


<P ALIGN=RIGHT>di
<A HREF="mailto:corrado.ignoti@rccr.cremonat.it">Corrado Ignoti</A>
</P>


<HR>
<TABLE BORDER=0 CELLPADDING=0 WIDTH=100%>
<TR>

<TD ALIGN=left BGCOLOR="#ffffff">
<A HREF="gimp.html">
<IMG ALT="[precedente]" SRC="pj_images/a_left.gif" BORDER=0></A>
</TD>

<TD ALIGN=center BGCOLOR="#cccccc">
<FONT COLOR="#00ff00">
<A HREF="gimp.html">GIMP</A>
- <A HREF="index.html">Copertina</A> -
<A HREF="linux-edicola.html">CDROM-edicola</A>
</FONT>
</TD>

<TD ALIGN=right BGCOLOR="#ffffff">
<A HREF="linux-edicola.html">
<IMG ALT="[successivo]" SRC="pj_images/a_right.gif" BORDER=0></A>
</TD>

</TR>
</TABLE>

</BODY>
</HTML>