Newsgroup: it.comp.lang.perl
Titolo: problema di "concetto"

Mi scuso per il topic fuorviante, ma non sapevo come definirlo. :)
 
Dopo aver fatto decine di esperimenti e prove, ed aver "licenziato" il mio 
bot irc come funzionante, mi sono accorto che funzionava come volava lui, e 
non sempre, quindi dopo altre prove ed esperimenti, sono ripartito da 0 
sperando di non commettere gli stessi errori.
 
Ricordo che lo scopo di questo bot, è di gestire gli accessi ad un canale 
IRC. Quindi se chi entra è abilitato entra, altrimenti viene cacciato fuori. 
Il codice risultante dai miei "salti mortali programmatori", sostanzialmente 
funziona ma la parte delegata a cancellare un utente dal database ha un 
problema.
 
Se si cerca di cancellare un utente non presente, segnala che l'utente non 
esiste e tira dritto per la sua strada, se esiste lo cancella regolarmente. 
Il difetto è che se tento di cancellare un utente che non esiste, tutto 
funziona perfettamente, anche ripetendo più volte la cosa. Se cancello un 
utente che era nel database un'altra volta, anche non consecutivamente lo 
script entra in un loop con questo errore:
 
Use of uninitialized value in string eq at 
killer2.pl
 line 135, <$fh> line 
4.
 
questa è la parte di codice interessata (abbiate pietà che sono 
autodidatta):
 
 if ($answer =~ /:(.*)!.+?(PRIVMSG)(.+?)\s:\!del\s(.*)/) {
        $adm = $1;
         $utente = $4;
         chop $utente;
                &checkadm($1);
                if ($trovato eq $1) {
                        &checkDB($4);
                        if ($trovato2 eq $utente) {
                                my $index = 0;
                                $index++ until $database[$index] eq $utente; 
#   <<----<<<<    riga 135
                                splice(@database, $index, 1);
                                untie @database;
                                tie @database, 'Tie::File', 'KillerBot.dat';
                                print $server "PRIVMSG $chan :  $utente 
rimosso dal Database \r\n";
                            }
                    else {
                        print $server "PRIVMSG $chan : $utente non risulta 
presente nel Database\r\n";
                        }
                }
        }
io non riesco a capire dove sia l'inghippo, perchè per dare errore a quella 
riga, il confronto 2 righe sopra ( if ($trovato2 eq $utente) {) deve aver 
dato esito positivo (e giustifica il loop, dato che nel database non esiste 
più $utente), e non ha molto senso visto che $utente viene regolarmente 
cancellato.
 
per semplificare, dato che io a spiegarmi sono peggio che a programmare... 
ho un database di nomi:
 
pippo
pluto
paperino
...
...
 
eseguo !del topolino: ricevo messaggio di utente non presente
eseguo !del pluto: pluto viene rimosso
eseguo !del pluto ricevo l'errore indicato sopra...
 
la sub "checkDB()" è questa:
 
sub checkDB {
$trovato2;
  foreach ( @database )
         {
      if( /$utente/ ) { $trovato2 = $_; last }
      }
return $trovato2;
}
 
consigli?
 
-- 
Fri(END), Boyfri(END), Girlfri(END), Bestfri(END). Everything has an END 
except...Fam(ILY)! It Has 3 Letters that say I LOVE YOU 
 

 sperando di non commettere gli stessi errori.
 
Ho migliorato la situazione :-) Anche se persiste un errore...
Ho riscritto la sub checkDB() cosě:
 
sub checkDB {
$trovato2 = first { /$utente/ }  @database;
        return $trovato2;
}
 
adesso posso tranquillamente cancellare quante volte voglio un elemento dal 
DB e non entra piů in loop, perň dopo il primo comando andato a buon fine, 
ricevo un messaggio di errore per i successivi questo č parte del log della 
sessione:
 
:liftman!~lh...@prova.script PRIVMSG #liftman :!del liftman
:liftman!~lh...@prova.script PRIVMSG #liftman :!del liftman
Use of uninitialized value $trovato2 in string eq at 
killer2.pl
 line 148, 
<$fh> line 6.
 
la mia conoscenza del perl č quella che č ma se la sequenza 
sub->ritorno->confronto variabili va a buon fine la prima volta senza 
errori, mi aspetto che funzioni sempre. Se ci fosse per esempio un problema 
di "scope", l'errore lo darebbe sempre e comunque, o no?
 
la riga incriminata č la seconda tra queste 2 (la variabile $trovato2 č 
correttamente inizializzata all'inizio del listato, assieme a tutte le altre 
variabili):
 
&checkDB($utente);
    if ($trovato2 eq $utente) {


 <$fh> line 6.
 
Alla fine ragionandoci un poco (non fate caso ai bernoccoli...) ho capito il 
perchč dell'errore..
 
la sub "originale" era questa:
 
sub checkDB {
$trovato2 = first { /$utente/ }  @database;
	return $trovato2;
}
 
tutto andava bene, fino a che veniva trovata corrispondenza nel DB, al 
contrario $trovato2 non era valorizzata, da qua l'errore (almeno credo di 
aver capito cosě). Quindi ho aggiunto 3 righe alla sub, e cosě almeno pare 
funzionare senza errori. Nel frattempo perň ho trovato un'altra falla, ma 
apro topic apposito.
 
sub checkDB {
 
$trovato2 = first { /$utente/ }  @database;
	if (defined $trovato2) { return $trovato2 }
	else {
		$trovato2 = "assente";
		return $trovato2;
