Desenvolupament de Funcions pels Sistemes Informàtics
ASI-2
GNU/Linux
Arxius de Guió (Scripts) utilitzant llenguatge Perl - I
18/01/10

Arxius de guió (Scripts) utilitzant llenguatge Perl - I


1- Documentació
Pagines principals
Pàgina oficial: www.perl.com
The Perl Directory: www.perl.org

CPAN: Biblioteca de recursos Perl.
Perl Foundation: http://www.perlfoundation.org/
Documentació 
http://perldoc.perl.org/
http://perldoc.perl.org/perl.html
http://www.cs.cmu.edu/cgi-bin/perl-man
http://www.perlfoundation.org/perl5/index.cgi
http://www.geocities.com/SiliconValley/Station/8266/perl/
http://www.ulpgc.es/otros/tutoriales/perl/cap1.htm
Contenidors d'arxius de guió (Script repositories)
http://www.cpan.org/scripts/index.html
http://www.microsoft.com/technet/scriptcenter/scripts/perl/default.mspx?mfr=true
http://www.roth.net/perl/scripts/

2- GUI IDE Geany
a)
 Icona de compil.lació
b) Icona d'execució

3- Execució d'arxius de guió Perl

a) Crea un fitxer de nom perl1.pl amb el següent codi:
#! /usr/bin/perl
print "Hola mon!!!! \n"; 
b) Fes-ho executable:
chmod 755 perl1.pl
c)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl1.pl
d)
Una manera alternativa d'execució és cridar a l'arxiu de guió  amb l'interpret de perl, de la següent manera:
perl  perl1.pl
i en aquest cas, no cal fer executable l'arxiu de guió.

4- Declaració de variables
a)
La declaració de variables fa per mitja de l'ordre my. Les variables en el moment de la declaració no tenen format. S'assigna format per mitjà de l'assignació d'una cadena o número a la variable.
El valor per defecte d'una variables és 0 o "" (Valor que serà assignat la primera vegada que utilitzem la variable, en funció de la instrucció executada).
b) Crea un fitxer de nom perl2.pl amb el següent codi:
#! /usr/bin/perl
my $variable = "Hola mon!!!";
my $num=3;
print $variable;
print $num;  
c) Fes-ho executable:
chmod 755 perl2.pl
d)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl2.pl

5- Comentaris
a)
Qualsevol línia que comenci per # serà tractada com un comentari i no serà executada
b) Crea un fitxer de nom perl3.pl amb el següent codi:
#! /usr/bin/perl
my $variable = "Hola mon!!!";
my $num=3;
print $variable;
#print $num;  
c) Fes-ho executable:
chmod 755 perl3.pl
d)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl3.pl

6- Ordre print
a)
Com ja hem vist a la resta d'exemples, l'ordre print permet imprimir a la pantalla una cadena de caràcters, número o variable que li sigui passada com a paràmetre. La coma , serveix per serparar variables, número o cadenes a imprimir. El canvi de línia és \n. El retorn al principi de línia és \r. Amb les dobles cometes, la coma deixa de ser un caràcter especial.
b) Crea un fitxer de nom perl4.pl amb el següent codi:
#! /usr/bin/perl
my $variable = "Hola mon!!!";
my $num=3;
my $num1=4;
my $num2=5;
print $variable,$num;
print "$variable,$num";
print "$variable,$num\n";
print "$variable,$num1\r";
print "$variable,$num2\n";
print "$variable,$num1\n";
print "$variable,$num2\n";
print "El valor de num1 és $num1"
c) Fes-ho executable:
chmod 755 perl4.pl
d)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl4.pl 

7- Assignació d'una entrada del teclat a una variable
a) Crea un fitxer de nom perl5.pl amb el següent codi:
#!/usr/bin/perl
my $nom;
print "Escriu el teu nom:";
$nom=<STDIN>; #Assignació de $nom al valor del fitxer d'entrades standard, o sigui, el teclat.
chop($nom); #LA funció chop() suprimeix l'últim caràcter del contingut d'una variable que contingui una cadena. En el nostre cas és <Enter>.
print "Hola, $nom!!!\n";
b) Fes-ho executable:
chmod 755 perl5.pl
c)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl5.pl 
d) Executeu el mateix script, sense utilitzar la funció chop().

8- Operadors numèrics
Per veure tots els operadors posibles, aneu a --> http://perldoc.perl.org/perlop.html
a)
Els operadors numèrics són:
    a.1) + (Suma)
    a.2) -  (Substracció)
    a.3) * (Multiplicació)
    a.4) / (Divisió)
    a.5) ** (Potència).
b) Crea un fitxer de nom perl6.pl amb el següent codi:
#!/usr/local/bin/perl
my $num1,$num2,$num3;
print "Escriu el primer número:";
$num1=<STDIN>;
chop($num1);
print "Escriu el segon número:";
$num2=<STDIN>;
chop($num2);
$num3=$num1+$num2;
print "La suma de $num1 i $num2 és $num3\n";
$num3=$num1-$num2;
print "La substracció de $num1 i $num2 és $num3\n";
$num3=$num1*$num2;
print "La multiplicació de $num1 i $num2 dóna $num3\n";
$num3=$num1/$num2;
print "La divisió de $num1 i $num2 és $num3\n";
$num3=$num1**$num2;
print "La potència $num1 elevat a $num2 és $num3\n";
b) Fes-ho executable:
chmod 755 perl6.pl
c)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl6.pl 

9- Comparacions numèriques
a) Els símbols de comparació numèrica són:
    a.1) "<"        És TRUE si el valor de l'esquerra és més petit que el de la dreta.
    a.2) ">"        És TRUE si el valor de l'esquerra  és més gran que el de la dreta.
    a.3) "= ="      És TRUE si el valor de l'esquerra és igaual al de la dreta.
    a.4) "<="      És TRUE si el valor de l'esquerra és igual o més petit que el de la dreta.
    a.5) ">="      És TRUE si el valor de l'esquerra és igual o més gran que el de la dreta.
    a.6) "!="       És TRUE si el valor de l'esquerra no és igual al de la dreta.
b) S'utilitza en combinació amb les instruccions if...else, while, until. Veurem aquestes ordres més endavant.

10- Operadors amb cadenes de caràcters
a)
El  símbols més típics són
    a.1)   .       Concatenació de cadenes de caràcters.
    a.2)   lt      És TRUE si el valor de l'esquerra  és més gran que el de la dreta.
    a.3)   gt     És TRUE si el valor de l'esquerra és igaual al de la dreta.
    a.4)   le     És TRUE si el valor de l'esquerra és igual o més petit que el de la dreta.
    a.5)   ge    És TRUE si el valor de l'esquerra és igual o més gran que el de la dreta.
    a.6)   eq    És TRUE si el valor de l'esquerra no és igual al de la dreta.
    a.7)   ne    És TRUE si el valor de l'esquerra no és igual al de la dreta.
b) Crea un fitxer de nom perl7.pl amb el següent codi:
#!/usr/bin/perl
my $var;
$var="HOLA"." JOAN";
print "$var";
c) Fes-ho executable:
chmod 755 perl7.pl
d)
Executa-ho (en aquest cas, des del directori on ha estat desat):
./perl7.pl 
e)
Els simbols lt....ne s'utilitzen en combinació amb les estructures  if...else, while,until. Veurem aquestes estructures més endavant.

11- Operadors lògics
a)
 && ,and  --> AND
b)  ||
,or  --> OR
c)  not --> Negació
d) Els operadors lògics s'utilitzen en combinació amb l'estructura if...else. Veurem aquesta estructura més endavant.

12- Estructura if..else. Ordre unless
Exemple 1
#!/usr/bin/perl
my $edat,$dif;
print "Escriu la teva edat: ";
$edat=<STDIN>;
chop($edat);
if ( $edat > 18 )
{
    print "Vostè és major d'edat. Pot votar\n";
    #Tot i que només hi ha una instrucció, cal obrir i tancar la instrucció if amb { i }
}
else
{
    print "Vostè és menor d'edat. No pot votar\n";
    $dif=18-$edat;
    print "Vostè s'haurà d'esperar $dif anys per poder votar\n";
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl8.pl.

Exemple 2
#!/usr/bin/perl
my $cad1,$cad2;
print "Escriu la primera cadena: ";
$cad1=<STDIN>;
chop($cad1);
print "Escriu la segona cadena: ";
$cad2=<STDIN>;
chop($cad2);
if ( $cad1 lt $cad2)
{
    print "$cad1\n";
    print "$cad2\n";
}
else
{
    print "$cad2\n";
    print "$cad1\n";
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl9.pl.

Exemple3
#!/usr/bin/perl
my $cad1,$cad2;
my $num1,$num2;

print "Escriu la primera cadena: ";
$cad1=<STDIN>;
chop($cad1);
print "Escriu la segona cadena: ";
$cad2=<STDIN>;
chop($cad2);

print "Escriu el primer número: ";
$num1=<STDIN>;
chop($num1);
print "Escriu el segon número: ";
$num2=<STDIN>;
chop($num2);
if (( $cad1 lt $cad2) and ($num1 >=  $num2))
{
    print "$cad1\n";
    print "$cad2\n";
}
else
{
    print "$cad2\n";
    print "$cad1\n";
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl10.pl.

Exemple 4: Treballant amb unless
#!/usr/bin/perl
my $edat,$dif;
print "Escriu la teva edat: ";
$edat=<STDIN>;
chop($edat);
print "Vostè és major d'edat. Pot votar\n" if ( $edat > 18 );
print "Vostè no és major d'edat. No pot votar\n" unless ( $edat > 18 );

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl11.pl.

13- Estructura given..when --> Estrucutures de tipus switch
a)
Documentació: http://perldoc.perl.org/perlsyn.html#Switch-statements
NOTA: Aquesta estructura només és vàlida a partir de la versió 5.10 de perl
b)
Exemple:
#!/usr/bin/perl
use feature ":5.10";# use
my $opc;
print "Escriu la teva opció: ";
$opc=<STDIN>;
chop($opc);
given($opc)
{
     when (1) { say "Has escollit la 1a opció"; }
     when (2) { say "Has escollit la 2a opció";}
     when (3) { say "Has escollit la 3a opció"; }
     default { say "Opció incorrecta" }
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl12.pl.

14- Estructura while
a)
L'estructura de while és la següent:
    while (condició)
    {
        ordre_de_perl;
        .......
        .......
    }
b)
Exemple
#!/usr/bin/perl
my $num1,$num2,$num3,$opc;
$opc="s";
while ($opc eq "s")
{
    print "Escriu el primer número:";
    $num1=<STDIN>;
    chop($num1);
    print "Escriu el segon número:";
    $num2=<STDIN>;
    chop($num2);
    $num3=$num1+$num2;
    print "La suma de $num1 i $num2 és $num3\n";
    $num3=$num1-$num2;
    print "La substracció de $num1 i $num2 és $num3\n";
    $num3=$num1*$num2;
    print "La multiplicació de $num1 i $num2 dóna $num3\n";
    $num3=$num1/$num2;
    print "La divisió de $num1 i $num2 és $num3\n";
    $num3=$num1**$num2;
    print "La potència $num1 elevat a $num2 és $num3\n";
    print "\n";
    print "continua (s/n):";
    $opc=<STDIN>;
    chop($opc)

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl13.pl.

15- Estructura until
a)
L'estructura de while és la següent:
    until (condició)
    {
        ordre_de_perl;
        .......
        .......
    }
b)
Exemple
#!/usr/bin/perl
my $num1,$num2,$num3,$opc;
$opc="s";
until ($opc eq "n")
{
    print "Escriu el primer número:";
    $num1=<STDIN>;
    chop($num1);
    print "Escriu el segon número:";
    $num2=<STDIN>;
    chop($num2);
    $num3=$num1+$num2;
    print "La suma de $num1 i $num2 és $num3\n";
    $num3=$num1-$num2;
    print "La substracció de $num1 i $num2 és $num3\n";
    $num3=$num1*$num2;
    print "La multiplicació de $num1 i $num2 dóna $num3\n";
    $num3=$num1/$num2;
    print "La divisió de $num1 i $num2 és $num3\n";
    $num3=$num1**$num2;
    print "La potència $num1 elevat a $num2 és $num3\n";
    print "\n";
    print "continua (s/n):";
    $opc=<STDIN>;
    chop($opc)

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl14.pl.

15- Estructura foreach
a) L'estructura de foreach  és la següent:
    foreach   $var  (llista de número, noms del fitxers, elements d'un array,caràcters....)
    {
        ordre_de_perl;
        .......
        .......
    }
El bucle es repeteix tantes vegades com elements hi ha a la llista. En cada iteració del bucle, a la variable $var pren un dels valors de la llista.
b) Exemple
#! /usr/bin/perl
my $x,$uid,$gid;
$uid="root";
$gid="daemon";
foreach $x ("/home/asi2/prova1.pl","/home/asi2/prova2.pl")
{
    print "Canviant els permisos de $x\n";
    chmod 0444, $x;
    print "Canviant el propietari i el grup de $x\n";
    chown $uid,$gid,$x
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl15.pl.

16- Estructura for
a) L'estructura de for és la següent:
    for   (estat_inicial; test_condició_sortida_bucle, incr)
    {
        ordre_de_perl;
        .......
        .......
    }
El bucle es repeteix mentre no es compleixi la condició de sortida del bucle.
b) Exemple
#! /usr/bin/perl
my $x,$pot2;
for  ($x=0;$x<=20;$x++)
{
    $pot2=2**$x;
    print "La potència en base 2 de $x és $pot2\n";
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl16.pl.

17- Estrucura alternativa a given..when per realitzar un equivalent al switch..case de C
Si utilitzem una estructura com la següent, podrem simular un switch..case de C:
#! /usr/bin/perl
my $opc;
print "Escriu l'opció: ";
$opc=<STDIN>;
chop($opc);
switch:
{
     if ($opc==1) {print "Has escollit la primera opció"; last switch;}
     if ($opc==2) {print "Has escollit la segona opció"; last switch;}
     if ($opc==3) {print "Has escollit la tercera opció"; last switch;}
     printf "Opció incorrecta";
}
a) switch és una etiqueta, no una instrucció.
b) Aquesta estrucutura rep el nom de BLOCK amb etiqueta, que és similar a un bucle que s'executés només una vegada.
c) L'ordre last és com l'ordre break de C. Finalitza immediatament el bucle indicat a continuació amb un nom d'etiqueta. En el nostre cas,finalitza el bucle etiquetat amb el nom switch. O sigui, fa la mateixa funció que break de C dins d'un switch..case.

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl17.pl.

18- Ordres last,next,goto,redo pel control de bucles

a) L'ordre last o last ETIQUETA és com l'ordre break de C. Finalitza immediatament el bucle indicat a continuació amb un nomd'etiqueta. Si no es posa l'etiqueta , l'ordre sortirà del bucle més interior en el qual es trobi en aquell moment el programa. Es pot utilitzar en bucles for, while,  until,.....
b) L'ordre next o next ETIQUETA és com l'ordre continue de C. Finalitza l'actual iteració del bucle, sense importar en el estat a on es trobi en aquell moment, i continua amb la següent iteració del bucle.Si no es posa l'etiqueta , l'ordre sortirà del bucle més interior en el qual es trobi en aquell moment el programa. Es pot utilitzar en bucles for, while,  until,.....
c) L'ordre redo o redo ETIQUETA finalitza l'actual iteració del bucle, sense importar en el estat a on es trobi en aquell moment i torna a reiniciar el bucle des el principi.Si no es posa l'etiqueta , l'ordre sortirà del bucle més interior en el qual es trobi en aquell moment el programa. Es pot utilitzar en bucles for, while,  until,.....
d) L'ordre goto ETIQUETA fa un salt a l'etiqueta indicada, de la mateixa manera que ho feia el goto dels arxius tipus ".bat".  No és una instrucció recomanada.

19- LListes (també anomenades arrays)
a)
S'indexen a partit de zero.
b) No té una dimensió fixe.
c) No tots els elements de la llista han de ser del matexi tipus (podem barrejar, cadenes, números,..)
d) No es pot fer una llista de llistes
e) Declaració de variable: my  @llista;
f)
Assignació:  @llista=(0,2,4,6);
g)
Accés a una dada: $dada=@llista[2]; (En aquest cas, el contingut de $dada serà 4)
h) Modificació d'una dada: @llista[2]=8;
i)
Afegint nous element  a la llista: push @llista,$num; (Si p.ex, $num valgués 15, llavors @llista=(0,2,4,6,15))
j) Obtenció del número d'elements de l'array: $num=@llista; (Ara $num valdrà 5)
k) Obtenció i eliminació del primer element d'una llista: $num=shift @llista; (Ara llista torna a tenir 4 elements, i val @llista=(2,4,6,15))
k) Obtenció i eliminació de l'últim element d'una llista: $num=pop @llista; (Ara llista té 3 elements, i val @llista=(2,4,6))
l) Inversió de la posició dels elements d'una llista: @llista_rev=reverse(@llista); (Ara llista_rev val @llista_rev=(6,4,2))
m) Ordenació d'una llista de caràcters. Si @llista=("Hola", "Prova","Dilluns", "adeu","Llengua"), i escrivim l'ordre @llista_ord=sort(@llista), llavors llista_ord serà una nova llista amb els elements de llista ordenats a partir del seu codi ascii.
n) Conversió d'una cadena en una llista de cadenes: @llista=split(' ',$frase); (En aquest cas, l'element separador ha estat l'espai en blanc)
o) Unió de cadenes en  una única cadena: join(' ',@llista,$cadena);
p)
Exemples:
#! /usr/bin/perl
my @llista,$num,$string,$frase,@llista_ord;

@llista=(1,2,4,6);
$num=@llista[2];
print "$num\n";
$num=3;
@llista[2]=$num;;
print "@llista[2]\n";
$num=18;
push @llista,$num;
print "@llista[0]\n";
print "@llista[4]\n";
$num=@llista;
print "$num\n";
@llista=("Hola", "Prova","Dilluns", "adeu","Llengua");
@llista_ord=sort(@llista);
foreach $string (@llista_ord)
{
    print "$string,";
}
print "\n";
$frase="Provant ordre split";
@llista=split(' ',$frase);
foreach $string (@llista)
{
    print "$string\n";
}
$string="join";
@llista=("Provant","ara","la","instrucció");
$frase=join(' ',@llista,$string);
print "$frase\n";

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl18.pl.

20- Funcions o subrutines
a)
Definició:
    sub nom_rutina
    {
        ordres_perl;
    }
No cal declarar paràmetres.
b)
Utilització:
    $var=&nom_rutina(paràmetres);
    $var=&nom_rutina();
    &nom_rutina(paràmetres);
   
&nom_rutina();
c)
Paràmetres:  Les rutines reben, per valor, tots els paràmetres dins d'una variable especial anomenada @_ i cada paràmetre es pot recuperar individualment fent servir $_[0], $_[1],$_[2]....Es un sistema molt similar a l'utilitzat en C per pasar paràmetres a un programa durant la seva execució, o sigui, per pasar paràmetres a la funció main(argc,argv). 

Exemple1
#! /usr/bin/perl
my $f,$c;

sub suma
{

    local($x,$y)=@_;
    #Hem decalarat $x i $y com a locals

    return($x+$y);
}
$f=8;
$c=&suma(4,$f);
print "El resultat és $c";

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl19.pl.

Exemple2
#! /usr/bin/perl

#Duplica $c
my $c;

sub duplica()
{
    $c*=2;
}
$c=8;
&duplica();
print "El resultat és $c";

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl20.pl.

21- Pas de paràmetres a un programa en perl
a)
La llista de paràmetres passat a un programa en perl es desa dins de la llista @ARGV
b) El número de paràmetres passat a un programa en perl es pot trobar creant una variable, p.ex ARGC, i fent $ARGC=@ARGV
c) Exemple
#!/usr/bin/perl
my $cadena;

$ARGC=@ARGV;
print "El número de paràmetres passats ha estat $ARGC\n";
print "Els paràmetres han estat els següents: \n";
foreach $cadena (@ARGV)
{
    print "$cadena\n";
}
print "El primer paràmetre ha estat: @ARGV[0]\n";

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl21.pl.

22- Inclusió d'arxius
És equivalent a la directiva #include del llenguatge C. Per incloure un fitxer utilitzarem l'ordre require("nom_fitxer.pl"); . Un exemple de la utilització d'aquesta ordre la teniu a la pràctica 6 d'Ampliació de xarxes. Amb aquesta ordre podem accedir a codi existent en un altre programa perl des del nostre programa.

23- Execucions d'ordres del shell del sistema operatiu des d'un programa en perl
 Execució d'ordres del shell: system <ordre_shell>; --> Exemple: system <ls -ls>;

24- Accés a fitxers
a)
Obrir un fitxer per llegir-lo: open (FILE,"nom_fitxer"); //FILE és el "fiile handler", no cal que es digui FILE, però, ha de ser un nom en majúcula.
b) Obrir un fitxer per escriure-hi:
open (FILE,">nom_fitxer");
c)
Obrir un fitxer per afegir-li nous continguts:
open (FILE,">>nom_fitxer");
d)
Detecció d'errors en el moment d'obrir un fitxer:
open (FILE,"nom_fitxer"); or die "No es pot obrir el fitxer $!";
e)
Llegir una línia d'un fitxer: $línia=<FILE>;
f)
Llegir tot un fitxer: @línia=<FILE>;
g)
Escriure una línia dins d'un fitxer: print  FILE  $linia;
h)
També podem executar: print FILE  @texte; per escriure dins d'un fitxer.
i) Tancar un fitxer: close(FILE);
k) Exemple 1
#!/usr/bin/perl
open(IN, "data.txt");

open(OUT, ">out.txt");
while($linea = <IN>)
{

      # manipula els caràcters llegits desats dins de $línia.
      # $linea. En aquest cas convertim tots els caràcters a minúscules.
      $linea =~ tr/A-Z/a-z/;
      # escriptura del resultat
      print OUT $linea;
}
close(IN);
close(OUT);

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl22.pl.
j)Exemple 2
El següent arxiu visualitza per consola el nom de cada usuari del sistema i el seu directori personal. Aquesta informació s'obté del fitxer /etc/passwd.
#!/usr/bin/perl
my $linia;
my @camps;
open(PASSWD, "/etc/passwd");
while ($linia = <PASSWD>) # Llegeix una línia del fitxerarchivo
{    
    chop($linia);
    #treiem el canvi de líniaquitamos el salto de línea
    @camps = split(/:/, $linia);
    #Creem una llista o array, amb cada paraula de la línia separada. Per separar paraules, indiquem que el caracter separdor és ":"
    print " Usuari: @camps[0]. Directori personal: @camps[5]";
    #La primera paraula del fitxer /etc/passwd sempre és el nom d'usuari, i la sisena és el seu directori personal.
}
close(PASSWD);
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl23.pl.

25- Utilitzant atributs de fitxers
a)
Cert si el fitxer existeix: -e
b)
Cert si el fitxer es pot llegir: -r
c)
Cert si el fitxer es pot executar: -x
d)
Cert si és un fitxer de dades: -f
e)
Cert si es un directori: -d
f)
Cert si és un enllaç simbòlic: -l
g)
Exemple
#!/usr/bin/perl
my $data;
$data = "data.txt";
if (-e $data)
{
       print "El fitxer $data SI existeix.\n";  
}
else
{
       print "El fitxer $data NO existeix.\n";
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl24.pl.

26- Treballant amb directoris
a) Obrir (accedir) a un directori: opendir (DIR,"nom_directori"); 
b) Llegir entrades d'un directori, fitxer a fitxer:
$directori=readdir (DIR);
c) 
Llegir totes les entrades d'un directori: @directori=readdir (DIR);
d)
Crear un directori: mkdir("nom_directori","màscara");
e)
Esborrar un directori:
f)
Exemple:
#!/usr/bin/perl
opendir (DIR,".");
@fitxers=readdir(DIR);
closedir (DIR);
foreach $fitxer (@fitxers)
{
    if (-f  $fitxer)
    {
        print $fitxer . "\n";
    }
}
Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl25.pl.
f) Exemple 2:
#!/usr/bin/perl
my $nom_dir;
my $perm_dir;
print "Indica el nom del directori\n";
$nom_dir=<STDIN>;
chop($nom_dir);
print "Indica els permisos del directori\n";
$perm_dir=<STDIN>;
chop($perm_dir);
mkdir($nom_dir);
chmod oct($perm_dir), $nom_dir;

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl26.pl.

27- Esborrant un fitxer
a)
Per esborrar un arxiu utilitzarem l'ordre: unlink("nom_fitxer")
b) Exemple:
#!/usr/bin/perl
my $nom_fitx;
my $nom_dir;
my $nom;
print "Indica el nom del fitxer\n";
$nom_fitx=<STDIN>;
chop($nom_fitx);
print "Indica el nom del directori\n";
$nom_dir=<STDIN>;
chop($nom_dir);
$nom=$nom_dir.'/'.$nom_fitx;
if (unlink($nom)==1)
{
    print "El fitxer s'ha esborrat\n";
}
else
{
    print "He tingut un problema per esborrar el fitxer\n";
}

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl27.pl.

28- Esborrant un directori
a)
Per esborrar un arxiu utilitzarem l'ordre: rmtree(["nom_fitxer"],1,1)
b)
Us caldrà posar al prinicipi del fitxer l'ordre
use File::Path
c) Exemple:
#!/usr/bin/perl
use File::Path;
my $nom_dir;
print "Indica el nom del directori\n";
$nom_dir=<STDIN>;
chop($nom_dir);
rmtree([$nom_dir],1,1);

Comprova el seu funcionament, creant un fitxer amb aquest codi, de nom perl28.pl.

PRÀCTICA



1- Utilitza el llenguatge perl per fer una calculadora que per mitjà d'un menú, et premeti escollir entre les cinc operacions bàsiques (*,/,+,-,**) i visualitzar el resultat.  L'usuari haurà de passar els dos números com a paràmetres de l'arxiu de guió. Si el número de paràmetres és incorrecte haurà d'enviar a pantalla el missatge "Número de paràmetres incorrecte" i finalitzar la seva execució. El nom de l'arxiu de guió serà perl1p1.pl.

1- Utilitza el llenguatge perl per fer un arxiu de guió que visualitzi per pantalla els números del  5 al 250 i els seus quadrats.El nom de l'arxiu de guió serà perl2p1.pl.

3- Utilitza el llenguatge perl per fer un arxiu de guió que comprovi si existeix un directori, el nom del qual t'ha de demanar durant l'execució del programa. Si no existeix el directori, el programa finalitzarà, donant per pantalla el missatge "El directori demanat no existeix". Si existeix, em mostrara per pantalla tots aquells fitxers del directori que siguin fitxers executables per l'usuari que executa el programaEl nom de l'arxiu de guió serà perl1p3.pl.

5- Utilitza el llenguatge perl per fer un arxiu de guió que mostri per pantalla tots els usuaris que tinguin un UID més gran o igual que 1000, però menor que 1200. El nom de l'arxiu de guió serà perl1p4.pl.

5- Utilitza el llenguatge perl per fer un arxiu de guió que comprovi si existeix un directori, el nom del qual has de passar com a segon paràmetre. Com a primer paràmetre has de passar una "r" o una "l". Si passes una "r" el programa fara un llistat de tots els fitxers del directori que tenen permís de lectura per l'usuari que executa el programa. Si passes una "l" el programa fara un llistat de tots els fitxers que siguin enllaços simbòlics a un altre fitxer. Si no existeix el directori, el programa finalitzarà, donant per pantalla el missatge "Nom de directori incorrecte o el directori demanat no existeix". Si no passem dos paràmetres, el programa ha de finalitzar enviant a la pantalla el missatge "Quantitat de parèmetres incorrecta". Si el segon paràmetre no és una r o una l, llavors el programa ha de finalitzar enviant a la pantalla el missatge "Segon paràmetre incorrecte"El nom de l'arxiu de guió serà perl1p5.pl.

6- Utilitza el llenguatge perl per fer un arxiu de guió per l'usuari root, en el qual se li demanin totes les dades necessàries per crear un usuari. Un cop donades les dades, el programa crearà l'usuari. El nom de l'arxiu de guió serà perl1p6.pl.

7- Utilitza el llenguatge perl per fer un arxiu de guió que utilitzi el mètode de xifratge ROT-13  per encriptar o desencriptar un texte d'una linia en català que passem al programa com a segon paràmetre. El programa ha de visualitzar el resultat per pantalla de l'encriptació o desencriptació. Com a primer paràmetre hem passar -e si volem encriptar o -d si volem desencriptar. Si no passem dos paràmetres, el programa ha de finalitzar enviant a la pantalla el missatge "Quantitat de parèmetres incorrecta". Consells: 1- Treballeu amb llistes. 2- Utilitzeu les funcions ord() i chr() de perl. El nom de l'arxiu de guió serà perl1p7.pl. 

8- Utilitza el llenguatge perl per fer un arxiu de guió a on els programes perl1p1.pl, perl1p2.pl i perl1p4.pl siguin funcions de perl que són cridades des d'un menú. El nom de l'arxiu de guió serà perl1p8.pl. 

9- Utilitza el llenguatge perl per fer un arxiu de guió que et demani el nom d'un fitxer que has de passar com a 2n paràmetre, i un nom de directori que has de passar com a 1r paràmetre. Si el fitxer existeix dins del directori, llavors l'arxiu esborrarà el fitxer. En cas de no existir, el programa finalitzarà mostrant per pantalla el missatge "El fitxer no existeix". Si hi ha cap problema per esborrar el fitxer, el programa finalitzarà mostrant per pantalla el missatge "El fitxer no s'ha pogut esborrar". Si no passem dos paràmetres, el programa ha de finalitzar enviant a la pantalla el missatge "Quantitat de parèmetres incorrecta". El nom de l'arxiu de guió serà perl1p9.pl. 

10-  Utilitza el llenguatge perl per fer un arxiu de guió que esborri tots els fitxers d'un directori que s'ha de passar com a primer  paràmetre però, no el directori si el segon paràmetre és -rm. Si el primer  paràmetre és -rd s'esborrarà tot el directori (amb els fitxer inclosos). Si no passem dos paràmetres, el programa ha de finalitzar enviant a la pantalla el missatge "Quantitat de parèmetres incorrecta". El nom del script serà perl1p10.pl

11
- S'han de lliurar els arxius de guió comprimits dins d'un arxiu de nom asi2_dfsi_nom_cognom_perl1.tar.gz que s'han d'enviar a cf(arrova)collados.org.  A l'assumpte del correu heu de posar asi2_dfsi_nom_cognom_perl1. L'últim dia per lliurar el treball és el 14-2-2010. Cada dia que passi d'aquesta data, treuré dos punts a la nota del treball.