Newsgroup: it.comp.lang.perl
Titolo: help eliminare una stringa

dunque..
premetto di essere all'inizio con perl..
ho un file simile a:
mario:rossi
giuseppe:verdi
franco:busi
scopo: selezionare tramite form uno dei campi ed eliminarlo.. ma..
vediamo dunque come ho fatto la selezione:
...
<form action="test.cgi" method="post">
EOM
open(CLIENTS, "/miofile");
while(<CLIENTS>) {
$ThisLine = $_;
chomp ($ThisLine);
@userlist = ($ThisLine);
@list = split (/:/,"@userlist");
#print $list[0];
print "<tr>";
print "<td width=\"33%\"><p align=\"left\"><font 
face=\"Verdana,Arial,Helvetica\" 
size=\"2\"><b>$list[0]</b></font></p></td>";
print "<td width=\"33%\"><p align=\"left\"><font 
face=\"Verdana,Arial,Helvetica\" 
size=\"2\"><b>$list[1]</B></font></p></td>";
print "<td width=\"33%\"><p align=\"center\"><input type=checkbox 
name='delete' value='$list[1]'></td>";
print "</tr>";
}
close(CLIENTS);
print "</table><br>";
print <<EOM;
<input type="submit">
EOM
#########################################
fin qui tutto ok posso selezionare e passare il tutto a test.cgi
use CGI;
$query = new CGI;
$delete = $query->param("delete");
pesco quindi la variabile $delete proveniente dal form precedente
e:
if ($delete == ""){
print "Nessun record selezionato";
}
else{
system("cat /miofile |grep -v $delete > /var/serveradmin/clients_tmp");
print"$delete";
system("mv -f /miofiles_tmp /miofile");
}
qui ci deve essere qualcosa che non funzia perchč se non seleziono nulla 
nelle intenzioni dovrebbe stamparmi il messaggio ma nei fatti elimina 
completamente il contenuto del file perché?

system("mv -f /miofiles_tmp /miofile");
/miofiles_tmp da dove salta fuori?
Ciao.

 di un valore che hai già memorizzato in una variabile?
ok mi sei stato di grande aiuto, ora dopo qualche ritocco ho:
il file clients.cgi
#######################
#!/usr/bin/perl
require './
lib.pl
';
&header(Clients, "",);
print <<EOM;
<table width="100%" border="0" cellspacing="0" cellpadding="0" >
<tr><td>
<hr>
<a href="clients.cgi"><img src="images/clients-active.gif" border="0" 
alt="Clients" title=" Clients " ></a>
<a href="domains.cgi"><img src="images/domains.gif" border="0" alt="Domains" 
title=" Domains " ></a>
<a href="server.cgi"><img src="images/server.gif" border="0" alt="Server" 
title=" Server " ></a>
<br><br>
<a href="new_clients.cgi"><img src="images/cl_new.gif" border="0" alt="New 
Client" title=" New Client "></a>
<hr><br>
<center>
<table border="0" cellpadding="0" whith="80%">
<tr>
<th height="26" width="33%" bgcolor=#6696bc><font 
face="Verdana,Arial,Helvetica" size="2" color="#ffffff"><b> 
Company</b></font></th>
<th height="26" width="33%" bgcolor=#6696bc><font 
face="Verdana,Arial,Helvetica" size="2" color="#ffffff"><b> Client 
name</b></font></th>
<th height="26" width="33%" bgcolor=#6696bc><font 
face="Verdana,Arial,Helvetica" size="2" color="#ffffff"><b> 
Delete</b></font></th>
</tr>
<form action="test.cgi" method="post">
EOM
open(CLIENTS, "/var/serveradmin/clients");
while($ThisLine = <CLIENTS>) {
chomp ($ThisLine);
@list = split (/:/,"$ThisLine");
print "<tr>";
print "<td width=\"33%\"><p align=\"left\"><font 
face=\"Verdana,Arial,Helvetica\" 
size=\"2\"><b>$list[0]</b></font></p></td>";
print "<td width=\"33%\"><p align=\"left\"><font 
face=\"Verdana,Arial,Helvetica\" 
size=\"2\"><b>$list[1]</B></font></p></td>";
print "<td width=\"33%\"><p align=\"center\"><input type=checkbox 
name='delete' value='$list[1]'></td>";
print "</tr>";
}
close(CLIENTS);
print "</table><br>";
print <<EOM;
<input type="submit">
EOM
fondo();
#############################
ed il file test.cgi
######################
#!/usr/bin/perl
require './
lib.pl
';
&header(Clients, "",);
use CGI;
$query = new CGI;
$delete = $query->param("delete");
print <<EOM;
<table width="100%" border="0" cellspacing="0" cellpadding="0" >
<tr><td>
<hr>
<a href="clients.cgi"><img src="images/clients-active.gif" border="0" 
alt="Clients" title=" Clients " ></a>
<a href="domains.cgi"><img src="images/domains.gif" border="0" alt="Domains" 
title=" Domains " ></a>
<a href="server.cgi"><img src="images/server.gif" border="0" alt="Server" 
title=" Server " ></a>
<br><br>
<!--
<a href="new_clients.cgi"><img src="images/cl_new.gif" border="0" alt="New 
Client" title=" New Client ">
!-->
<hr><br>
EOM
if ($delete eq ""){
print "-- $delete";
}
else{
system("cat /var/serveradmin/clients |grep -v $delete > 
/var/serveradmin/clients_tmp");
print"$delete";
system("mv -f /var/serveradmin/clients_tmp /var/serveradmin/clients");
}
fondo();
#######################
ora mi chiedevo se è possibile far ricaricare la pagina precedente anziché 
arenarsi in questo file
inoltre se possibile sostituire la funzione:
if ($delete eq ""){
print "-- $delete";
}
else{
system("cat /var/serveradmin/clients |grep -v $delete > 
/var/serveradmin/clients_tmp");
print"$delete";
system("mv -f /var/serveradmin/clients_tmp /var/serveradmin/clients");
}
facendola interamente in perl senza ricorrere ad una chiamata esterna
grazie

facendola interamente in perl senza ricorrere ad una chiamata esterna
Certo che è posssibile. Bisognerebbe poi valutare se sia anche conveniente,
ma questo puoi farlo meglio tu, osservando il comportamento effettivo delle
due versioni. La chiamata esterna occupa un certo tempo e certe risorse, ma
d'altra parte i programmi esterni possono essere in alcuni casi più veloci
del corrispondente codice perl. A priori non mi sento di dire quale sia la
strada migliore (anche se io, per mio gusto personale, tenderei a far tutto
in perl).
In questo momento non ho tempo per scriverti un esempio di come fare (e tra
l'altro non sono sicuro di ricordare bene che cosa fa "grep -v"). Si tratta
comunque di aprire il file in perl, leggerlo riga per riga, e riscrivere su
un altro file solo quello che vuoi riscritto.
Ciao.

    }
oggi mi sento un po' pedante :-)
quello che dici è lievemente sbagliato, e può generare errori
(anche se estremamente improbabili) molto difficili da
individuare.
la linea:
    while(<CLIENTS>) { ... }
NON è equivalente a:
    while($_ = <CLIENTS>) { ... }
bensì a:
    while(defined($_ = <CLIENTS>)) { ... }
la differenza è sottile, ma c'è: come l'hai scritta tu, il
programma smette di leggere dal file se trova una riga vuota
(o che contiene solo uno zero) senza a capo finale.
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;

(o che contiene solo uno zero) senza a capo finale.
Cioè, nel 99.9999% dei casi, a tutti i fini pratici, a fine file. Comunque
sì, undef è diverso da null (o da 0; ma verifica meglio quest'ultimo caso,
perché a me pare proprio di no: la riga con solo uno zero viene letta).
Ciao.

 facendola interamente in perl senza ricorrere ad una chiamata esterna
Certo che si puo':
$file='/var/serveradmin/clients';
$file_tmp=$file.'_tmp'
open (IN,$file);
open (OUT,>$file_tmp);
while (<IN>) {
        print OUT unless /$delete/;
}
close IN;
close OUT;
rename ($file_tmp,$file);
E comunque anche volessi mantenere le chiamate di sistema puoi 
sostituire:
system("cat /var/serveradmin/clients |grep -v $delete > 
/var/serveradmin/clients_tmp");
con 
system("grep -v $delete /var/serveradmin/clients > 
/var/serveradmin/clients_tmp");
e la shell lavora un poco meno.
-- 
Saluti,
Giancarlo