7a sessió: Utilització d'arxius en PERL.

Una de les principals aventatges de programar al servidor és poder treballar amb arxius. Veurem les funcions PERL que ens permeten aquesta tasca.

Cal resaltar que, de forma semblant a altres llenguatges, a PERL hem d'identificar cada arxiu amb un manipulador o referència. Nosaltres farem servir lletres majúscules per a aquest identificador: ENTRADA, SORTIDA, ...

Primer cal obrir l'arxiu. Farem servir la funció open, on hem d'especificar l'identificador que farem servir d'ara en endavant i el nom físic de l'arxiu, amb el directori i la opció d'escritura si cal. Així per a obrir l'arxiu telefons.dat i associar-lo al manipulador DATOS farem:

Ara podem treballar amb l'arxiu: Finalment haurem de tancar l'arxiu:
    close (DATOS);

Veiem un exemple que ens permet editar de forma remota un arxiu ASCII:

#!/usr/bin/perl
print "content-type: text/html\n\n";
if ($ENV{'REQUEST_METHOD'}eq "POST")
{
    read(STDIN,$entrada,$ENV{'CONTENT_LENGTH'});
    }
elsif ($ENV{'REQUEST_METHOD'}eq "GET")
{
    $entrada= $ENV{'QUERY_STRING'};
    }
else
{
    $entrada= $ARG[0];
    }
foreach (split(/\&/,$entrada))
{
    ($clave,$valor)=split(/=/,$_);
    $clave =~ tr/+/ /;
    $clave =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
    $valor =~ tr/+/ /;
    $valor =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
    $parametro{$clave}=$valor;
    }

$archivo=$parametro{'FICHERO'};
$archivo =~ s/%2F/\//g;

print "<html><head></head><body>";
print "<h2>Edici&oacute; de $archivo</h2>";
print "<form action=\"escriu.cgi\" method=\"POST\">";
print "<input name=\"FICHERO\" type=\"hidden\" value=\"$archivo\">";

print "<textarea name=\"CONTENIDO\" rows=\"12\" cols=\"60\" >";
open (ENTRADA, "$archivo") || die "Error: no es pot obrir el fitxer";
while ($linea = <ENTRADA>)
{
   print "$linea";
   }
close (ENTRADA);
print "</textarea><br>";
print "<input type=\"submit\" value=\"Desa'l\">";
print "</form>";
print "</body></html>";
 

Aquest script s'encarrega de desar l'arxiu (escriu.cgi):

#!/usr/bin/perl
print "content-type: text/html\n\n";
if ($ENV{'REQUEST_METHOD'}eq "POST")
{
    read(STDIN,$entrada,$ENV{'CONTENT_LENGTH'});
    }
elsif ($ENV{'REQUEST_METHOD'}eq "GET")
{
    $entrada= $ENV{'QUERY_STRING'};
    }
else
{
    $entrada= $ARG[0];
    }
foreach (split(/\&/,$entrada))
{
    ($clave,$valor)=split(/=/,$_);
    $clave =~ tr/+/ /;
    $clave =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
    $valor =~ tr/+/ /;
    $valor =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
    $parametro{$clave}=$valor;
    }

$archivo = $parametro{'FICHERO'};
$archivo =~ s/%2F/\//g;
$texto = $parametro{'CONTENIDO'};

open (SALIDA, ">$archivo") || die "Error: no es pot obrir el fitxer";
print SALIDA $texto;
close (SALIDA);

print "<html><head></head><body>";
print "<h2>$archivo desat amb exit</h2>";
print "</body></html>";
 

Important: l'autor no es fa responsable dels perjudicis causats per l'utilització d'aquest script, especialment si es permet la seva execució en un directori públic i els permissos d'escriptura dels arxius del servidor no estan configurats de forma adient.

 
© Jordi Orts, abril 2001