Moin moin,
Perl macht mich mal wieder mit seinen Referenzen fertig...... HELP!!
Ich habe folgendes Testscript:
#/usr/bin/perl
use strict;
my %I;
$I{'ce'}{'lan'}{1}{'ifc'}="FastEthernet0/2-3";
$I{'ce'}{'lan'}{1}{'ip'}="1.1.1.1";
$I{'ce'}{'lan'}{2}{'ifc'}="GigabitEthernet0/1-2";
$I{'ce'}{'lan'}{2}{'ip'}="2.2.2.2";
my %old_lan_hash=%{$I{'ce'}{'lan'}};
my $count_lan=1; my $count_lan_new=1;
while ($old_lan_hash{$count_lan}{'ifc'})
{
print "\nTesting interface: ".$old_lan_hash{$count_lan}{'ifc'};
if ($old_lan_hash{$count_lan}{'ifc'}=~/^(.*)(\d+)-(\d+)/)
{
my $main=$1; my $start=$2; my $end=$3;
for (my $a=$start;$a<=$end;$a++)
{
%{$I{'ce'}{'lan'}{$count_lan_new}}=%{$old_lan_hash{$count_lan}};
$I{'ce'}{'lan'}{$count_lan_new}{'ifc'}="FastEthernet0/".$a;
print "\nNew LAN interface: ".$count_lan_new.": ".$I{'ce'}{'lan'}{$count_lan_new}{'ifc'}." (IP:".$I{'ce'}{'lan'}{$count_lan_new}{'ip'}.")";
$count_lan_new++;
}
}
$count_lan++;
}
print "\n\n";
Aufgabe des Scriptes ist es Interfaceranges zu expanden.
Also wenn ein Nutzer "FastEthernet0/0-1" eingibt, soll das umgewandelt werden in "FastEthernet0/0" und "FastEthernet0/1". Die folgenden Interfaceangaben sollen natürlich nicht überschrieben werden, deswegen speichere ich die bestehenden Interfaces zum parsen in einem neuen Hash %old_hash. Ich möchte jetzt also %old_hash Interface für Interface durchlaufen und dabei das neue LAN-Hash bilden.
Das Problem ist aber, dass das Hash %old_hash nicht komplett dereferenziert ist. D.h. Wenn ich das neue LAN-Interface schreiben will überschreibe ich auch den Wert in %old_hash. Dadurch endet die Schleife dann leider unerwartet. Die Ausgabe sieht dann wie folgt aus:
Testing interface: FastEthernet0/2-3
New LAN interface: 1: FastEthernet0/2 (IP:1.1.1.1)
New LAN interface: 2: FastEthernet0/3 (IP:1.1.1.1)
Testing interface: FastEthernet0/3
Wie kann ich das beheben?
Jeden einzelnen Key zu derefenzieren würde an jeder Stelle an der ich das brauche 50 Zeilen Code verschlingen und das Gesamtscript aufwändiger zum Warten machen, wenn sich mal Parameter dazugesellen (was recht häufig der Fall ist...).