Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Hash di Hash di Array, come gestirli?

    hola,

    il titolo fa un pò paura ... ma è da stamani che ci lotto e vorrei vedere una luce in fondo al tunnel

    Come prima cosa posto il codice, cosi potete insultarmi liberamente
    codice:
    sub StartIp2Name()
    {
        ($fake, $fake, $fake, $fake, $fake, $currentYear, @fake) = localtime();
        $currentYear += 1900;
    
        # Open portalauth.log logfile
        open CPLF, "/usr/sbin/clog /var/log/portalauth.log|" || die "can't access portalauth log file\n";
        
        # Loop captive portal log file
        while (<CPLF>)
        {
            # Rimuove l'EOL dalla riga
            chomp;
            
            # Mar 27 11:25:50 firewall logportalauth[506]: LOGIN: computering, 00:a0:d1:be:4a:2e, 10.0.1.191
            ($month,$day,$time,$hostname,$process,$action,$user,$macaddress,$ip,@rest)=split;
    
            # Pulisce l'azione
            $action =~ s/:$//;
            
            # Verifica che la riga riguardi l'autenticazione
            next if (not $process =~ /logportalauth/);
            next if (not $action =~ /LOGIN|LOGOUT|TIMEOUT/);
    
            # Rimuove i : e le , dal testo
            $user =~ s/,$//;
            $ip =~ s/,$//;
            $timestamp = str2time("$currentYear/$month2dec{$month}/$day $time");
            
            # Imposta il tipo in base all'azione
            if ($action eq "LOGIN")
            {
                $type = 'start';
            }
            else
            {
                $type = 'end';
            }
    
            # Aggiunge l'elemento
            $authList{$ip}{$user}{$timestamp} = $type;        
        }
        
        # Close log file
        close CPLF;
        
        while (($ip, $usersRef) = each(%authList))
        {
            print "$ip:\n";
            
            while (($user, $timestampsRef) = each(%{$usersRef}))
            {
                print "\t$user\n";
                
                $timestamps = %{$timestampsRef};
                
                foreach $timestamp (sort { $a <=> $b} keys %{$timestampsRef})
                {
                    print $timestamp . "\n";
                    print $timestamps . "\n";
                    print $timestamps{$timestamp} . "\n";
                }
            }
        }
    }
    Questo codice non fa altro che aprire un file che contiene delle righe di log tipo
    codice:
    Mar 27 16:38:32 gateway logportalauth[482]: LOGIN: soluzioni, 00:a0:d1:be:4a:2e, 10.0.1.191
    Mar 27 16:38:36 gateway logportalauth[482]: LOGOUT: soluzioni, 00:a0:d1:be:4a:2e, 10.0.1.191
    Mar 27 16:38:40 gateway logportalauth[482]: TIMEOUT: soluzioni, 00:a0:d1:be:4a:2e, 10.0.1.191
    A me interessa organizzare questi dati in una gerarchia del tipo
    HASH[ip] -> HASH[username] -> HASH[timestamp] -> type

    "credo" che la struttura la salvi correttamente, ma come la leggo???

    quello che mi esce fuori è qualcosa tipo
    codice:
    10.0.1.191:
            soluzioni
    1238168312
    1/8
    detto tutto questo, premetto che il perl non lo uso da qualcosa come 6 anni e, anche quando lo usavo, avevo un cattivo rapporto

    ( basta notare la prima riga del codice che ho postato per capirlo )

    non capisco perché nel ciclo interno, quando mi ciclo i vari timestamp, non riesco a leggere il valore associato

    qualcuno resce ad illuminarmi

  2. #2
    non è facile senza sapere come viene costruito $timestamp che viene riempito tramite una funzione interna non nota.

    a parte ciò considera che la seguente operazione:

    $timestamps = %{$timestampsRef};

    non mi pare che abbia molto senso, in quanto referenzia nuovamente un hash che hai appena dereferenziato, ovvero:

    %{$timestampsRef} dereferenzia $timestampsRef (che è un reference all'hash %timestampsRef)
    $timestamps = lo referenzia nuovamente
    a questo punto ogni print su $timestamps non può avere esiti utili.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    più o meno ho capito quello che vuoi dirmi, ora fò qualche altra prova

    la funzione str2time, se ti riferisci a quella, l'ho presa dal modulo Date::Parse se non erro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.