Newsgroup: it.comp.lang.perl
Titolo: scansione file + query (2)

 Con la tua risposta magari apri un nuovo thread.
fatto
:)
grazie
-- 
Umin
n. p.: Richard Ashcroft - Science Of Silence

 paragrafi
[...]
mi pare di aver risolto con anche l'interazione al db:
le query avvengono correttamente
mi rimangono un po' di controlli da fare (isolare gli ipv6 da ipv4, ed 
alcune operazioni sulle classi degli ip) ma sostanzialmente funziona
grazie a voi che mi avete aiutato.
-- 
Umin
n. p.: Richard Ashcroft - Music Is Power

 :)
Perfetto.
Allora, prima di esporre lo script, un paio di precisazioni.
Sono andato a prendermi alloclist.txt (da 
ripe.net
, non da 
ripe.com
 ;-) 
ed ho verificato che il formato prevede sempre *4 spazi* a inizio riga 
per le righe "indentate" (vale a dire le righe /nome isp/ e /classe ip/) 
e il *tab* come separatore di campo (utilizzato nella sole righe classe 
ip, che sono le uniche righe strutturate o multicampo che dir si voglia).
In altre parole, il formato è il seguente:
ad.andorpac
<4 spazi>Servei de Telecomunicacions d'Andorra
<4 spazi>20050104<tab>85.94.160/19<tab>ALLOCATED PA
<4 spazi>19960627<tab>194.158.64/19<tab>ALLOCATED PA
<4 spazi>20051219<tab>2001:4df8::/32
Il separatore di riga è sempre il newline (\n) e nelle righe vuote c'è 
soltanto il newline.
Una curiosità: quando il nome ISP non è /chiuso/, termina sempre con uno 
spazio (prima del newline), altrimenti se è chiuso termina con la 
stringa "(closed)" seguita immediatamente dal newline.
Poi per quanto riguarda il riconoscimento dei blocchi CIDR IPv4 (di 
questo si tratta, non di indirizzi IP, a rigore), possiamo risparmiarci 
di reinventare la ruota, visto che qualcuno l'ha già fatto per noi.
C'è più di qualche modulo CPAN per il riconoscimento di tali stringhe, 
ed io ho adottato Net::Netmask:
http://search.cpan.org/~muir/Net-Netmask-1.9012/
Dovresti installarlo da CPAN (quando si studia il Perl, imparare a 
sfruttare CPAN è importante quanto imparare il linguaggio in sé).
Ciò premesso, ecco lo script *completo* (devi solo adattare il path 
locale verso il file alloclist.txt) che stampa esattamente la tabella da 
te richiesta.
Eseguilo ed accertati che sia esattamente quello che ti serviva. Una 
volta validato, se occorre passiamo alla scrittura dentro il db, che è 
tutta un'altra questione.
Ciao,
Emanuele.
=cut
use strict;
use warnings;
use Net::Netmask;
open SORG, '<', 'C:\Documents and Settings\emanuele\Desktop\alloclist.txt'
	or die 'Non riesco ad aprire alloclist.txt';
my ($dominio, $nome_isp, $chiuso, $it);
while ( <SORG> ) {
     chomp;
     next unless $_;
     my @campi = split /\t/;
     if ( $campi[1] ) {
         # La riga letta dal file è quella dell'IP.
         print "$dominio\t$nome_isp\t$campi[1]\n"
             if Net::Netmask->new2( $campi[1] ) && $it && ! $chiuso;
         next
     }
     if ( $campi[0] =~ s{^\s+}{} ) {
         # La riga letta dal file è quella della denominazione ISP.
         $nome_isp = $campi[0];
         $chiuso = $nome_isp =~ /\(closed\)$/ ? 1 : 0;
         next
     }
     # La riga letta dal file è quella del dominio.
     $dominio = $campi[0];
     $it = $dominio =~ /^it\./ ? 1 : 0
}

 Emanuele.
Emanuele, io ti ringrazio davvero tanto
per il momento mi sono giocato la domenica smanacciando un altro po' 
con il codice e leggendo un altro po' di documentazione... quando si e' 
agli inizi, per ogni cosa, tocca perderci del tempo con la propria 
capoccia, anche se questo talvolta risulta molto dispendioso in termine 
di ore... ma tant'e'
provero' subito il tuo script ma, come avrai forse letto, poco fa sono 
riuscito a risolvere, in maniera simile (la struttura dell'algoritmo e' 
identica) pero' usando le regexp e pochi altri controlli
ho testato anche le query ed adesso sembra funzionare tutto come 
dovrebbe (tranne per il discorso del addslashes come scritto poco fa)
mi rimane ancora da calcolare gli ip generati dalle varie classi (devo 
fare un po' di operazioni -gia' fatte in php qualche giorno fa- per 
risalire all'intervallo di ip generati da quella classe + i bit della 
sottorete) in modo che per ogni record io abbia, oltra all'isp, il 
dominio e la classe dell'ip, anche un intervallo che mi rappresenti da 
dove inizia a dove finiscono gli ip di quel provider
sicuramente avro' bisogno ancora d'aiuto perche' mi sembra ancora tutto 
-stranamente, vista la sintassi- molto diverso dal php che conosco 
meglio (a proposito, non esiste l'equivalente dell'explode() del php? 
c'e' lo split ma .. non mi sembra proprio la stessa cosa)
intanto ancora grazie per tempo, modo, cortesia ed efficacia.
buona domenica
-- 
Umin
n.p.: Richard Ashcroft - 75 Degrees (Bonus Track) [stop]

 buona domenica
Di nulla.
Ciao e buon divertimento con Perl ;-)
Emanuele.

 Ciao e buon divertimento con Perl ;-)
sinceramente detesto programmare e non mi ritengo nemmeno un guru, 
anzi, per certe cose dovrei resettarmi e ristudiare tutto da capo da 
tanto frammentario e' stato il mio approccio
pero' ammetto che la soddisfazione quando le cose funzionano e' 
talmente grande che per qualche ora/giorno rimani un po' come 
inebetito... ti sembra sempre di aver inventato/realizzato chissa'cosa 
mai :)
finiamola qua
stasera ho completato il tutto, compreso gli INSERT, compreso il 
calcolo degli ip_start ed ip_stop che mi servivano per il lavoro
da domani avro' altro a cui pensare... stanotte penso riusciro' a 
dormire :)
grazie ancora di tutto
ciao
-- 
Umin
n. p.: The Verve - Come On