Also, ich soll für die Arbeit ein Programm in PERL schreiben, dass alle vergebenen IP-Adressen im DHCP einliest und eine schöne statistik ausgibt.
Zurerst wollte ich eine flache Datenstruktur machen (also ein Array wo alle IPs drin sind). Aber wenn ich jedesmal diese ganze Liste durchsuchen muss nur um einen Datensatz upzudaten.... nein, schlechte performance.

Am besten geht es vermutlich mit Hashes. Damit ich eben soetwas benutzen kann
$HashContainer{'192'}->{'168'}->{'0'}->{'1'}->{'Name'}
Also ein Hash von Hashes von Hashes von Hashes von Hashes. Da wären die IPs dann in einer schönen geordneten Struktur untergebracht, schnelle Suche, genauso schnell alles Auslesbar wie bei einem großen Array.

Allerdings gehts bei mir nicht! Könnt ihr mal schaun ob ihr einen Fehler entdeckt:

Code:
#!/usr/bin/perl -w
$Db = &DbCreate();
&DbAddLeaseFile($Db);
&DbPeekAll($Db);


exit(0);


sub DbCreate {
        my %DbCreate_DB = ();
        return (\%DbCreate_DB);
}

sub DbAddLeaseFile {
        &DbPush($_[0], '192.168.0.1', 'MAC1', 'DEAD', 'DeadPcCalcing', 'Yesterday', 'Never');
        &DbPush($_[0], '192.168.0.2', 'MAC2', 'ALIVE', 'PingingAround', 'Yesterday_Too', 'Tomorrow');
}

sub DbPush {
        my @IP = split(/\./, $_[1]);
        my %Hash = %{$_[0]};
        my %newHash = ( 'IP' => $_[1],
                        'MAC' => $_[2]);
        $Hash{$IP[0]}{$IP[1]}{$IP[2]}{$IP[3]} = \%newHash;
my %tmp = %{$Hash{'192'}->{'168'}->{'0'}->{'1'}};#->{'IP'};
print %tmp;
print " $_[1]\n";
}

sub DbPeekAll {
#       foreach $i (keys %tmp_Db) {
#               print "$i \n";
#       }
}
(Die unterteilung für die Subs brauch ich dann beim eigentlichen Programm.... Also zumindest DbAddLeaseFile und DbPeekAll; Push und Create kann man eigentlich includieren, aber egal jetzt)

Wenn ich es ausführe bekomm ich folgenden Output:
Code:
IP192.168.0.1MACMAC1 192.168.0.1
Use of uninitialized value in hash dereference at ./hashtest.pl line 26.
 192.168.0.2
Beim Hinzufügen der 1. IP bekomm ich richtig "IP192.168.0.1MACMAC1" raus. Bei der 2. allerdings nur eine Störung.



Was mir noch aufgefallen ist: Wenn ich den Output folgendermaßen ändere:
Code:
my %tmp = %{$Hash{'192'}};#->{'168'}};#->{'0'}};#->{'1'}};#->{'IP'};
print %tmp;
print " $_[1]\n";
print %Hash;
print " $_[1]\n";
bekomme ich:
Code:
168HASH(0x8d20c18) 192.168.0.1
192HASH(0x8d09b3c) 192.168.0.1
168HASH(0x8d25898) 192.168.0.2
192HASH(0x8d20960) 192.168.0.2
Die Referenz für 192 ändert sich.... dabei wird es doch auf den webseiten, die ich gefunden hab so gemacht... HILFE!