Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

problema di "concetto"

3 views
Skip to first unread message

liftman

unread,
Apr 18, 2015, 8:27:42 AM4/18/15
to
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

liftman

unread,
Apr 19, 2015, 11:02:21 AM4/19/15
to

"liftman" <liftman_...@moredifficult.org> ha scritto nel messaggio
news:mgtijr$m4a$1...@speranza.aioe.org...
> 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.

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) {

liftman

unread,
Apr 20, 2015, 11:25:29 AM4/20/15
to

"liftman" <liftman_...@moredifficult.org> ha scritto nel messaggio
news:mh0g1q$g1n$1...@speranza.aioe.org...

> 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.

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;
0 new messages