Kurrija: Use of uninitialized value in split at...

Beim ausführen des folgenden Codesnippets erhalte ich als Ausgabe:

  
200200235125  
Use of uninitialized value in split at dhcpd.conf.leases.cmp.pl line 208, <LEASES> line 34.  
Use of uninitialized value in print at dhcpd.conf.leases.cmp.pl line 209, <LEASES> line 34.  
Use of uninitialized value in print at dhcpd.conf.leases.cmp.pl line 209, <LEASES> line 34.  
Use of uninitialized value in print at dhcpd.conf.leases.cmp.pl line 209, <LEASES> line 34.  
Use of uninitialized value in print at dhcpd.conf.leases.cmp.pl line 209, <LEASES> line 34.  
  
Use of uninitialized value in split at dhcpd.conf.leases.cmp.pl line 210, <LEASES> line 34.  
Use of uninitialized value in numeric eq (==) at dhcpd.conf.leases.cmp.pl line 212, <LEASES> line 34.  

Das Codesnippet geht von Zeile 205 bis 216

  
for( $i = 0; $i < $dhcpd_sn_id; $i++ ) {  
	@range = split( /\ /, $dhcpd{$i}[2] );  
	@rangea = split( /\./, $range[0] );  
	print $rangea[0], $rangea[1], $rangea[2], $rangea[3], "\n";  
	@rangeb = split( /\./, $range[1] );  
	@temp_ip = split( /\./, $lease_ip );  
	if( $temp_ip[0] == $rangea[0] && $temp_ip[0] == $rangeb[0] && $temp_ip[1] == $rangea[1] && $temp_ip[1] == $rangeb[1] && $temp_ip[2] == $rangea[2] && $temp_ip[2] == $rangeb[2] && $temp_ip[3] >= $rangea[3] && $temp_ip[3] <= $rangeb[3] ) {  
		$lease_subnetrange = $i;  
		last;  
	}  
}  

Die Relevanten Variablen haben hierbei folgende Werte:

  
$i = 0; #da erster Durchlauf der Schleife  
$dhcpd{$i}[2] = "200.200.235.125 200.200.235.254";  
$lease_ip = "200.200.235.44";  

LEASES stellt in der Fehlermeldung das als letztes aktive Filehandle da, welches im zu lesenden Textfile gerade eben in Zeile 34 ist.
Ziel des Codesnippets ist es, zuerst die IP-Range aus $dhcpd{0}[2] in ihre Blöcke zu zerlegen, anschließend mit $lease_ip genauso zu verfahren und anschließend Vergleiche durchzuführen.
Bedingung für den if-Block ist, dass die ersten drei Blöcke aller IPs übereinstimmen und der 4.te Block von $lease_ip innerhalb der Range liegt, was es eben in diesem Snippet herauszufinden gilt.
Die print-Ausgabe war nur zum Testen von mir eingefügt worden, um zu sehen, ob die Array-Elemente wirklich nicht initialisiert sind.
Wird sie auskommentiert, so verschwinden lediglich die Fehlermeldungen zu "print".
Allerdings veranschaulicht meiner Ansicht nach die Ausgabe mit den Fehlern wie paradox dieser Fall ist.

Vielen Dank schoneinmal für etwaige Kommentare

  1. hi,

    Vielen Dank schoneinmal für etwaige Kommentare

    IP-Adressen in Integer umrechnen. Macht alles viel einfacher.

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. IP-Adressen in Integer umrechnen. Macht alles viel einfacher.

      Hotte

      Nunja .. hierzu bräucht man aber z.B. Net::IP welche zmd. bei meinem strawberry_perl nicht dabei war.
      Da ich aber sowieso weitgehend ohne externe Methoden die der User ggf. noch nachladen müsste in diesem Script auskommen müsste, wäre das "Umrechnen" meines Wissens nach nur anhand eines Regulären-Ausdrucks möglich, was im Endeffekt ziemliche Ähnlichkeit mit meiner zweiten Lösung (die auch funktioniert) hätte.

        
      if( ($range = $dhcpd{$i}[2]) && $range =~ /^([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\ ([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})$/ && (@range = ([ $1, $2, $3, $4 ], [ $5, $6, $7, $8 ])) && $lease_ip =~ /^([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})\.([0-2]?[0-9]{0,2})$/ && $1 >= $range[0][0] && $2 >= $range[0][1] && $3 >= $range[0][2] && $4 >= $range[0][3] && $1 <= $range[1][0] && $2 <= $range[1][1] && $3 <= $range[1][2] && $4 <= $range[1][3] ) {  
      	$lease_subnetrange = $i;  
      	last;  
      }  
      
      

      Allerdings wäre ich an Ideen, woher der Fehler aus meinem Post kommen könnte, auch weiterhin interessiert (-;

      1. Nunja .. hierzu bräucht man aber z.B. Net::IP

        try this:

          
        ###################################################################################################  
        # Oktetten(Dezimal)schreibweise zu Numerisch  
        sub ipA2N{  
            my $ipA=shift;  
            return unpack("N", pack("C4", split(/\./, $ipA)));  
        }  
        ###################################################################################################  
        # Numerisch zu Oktetten(Dezimal)schreibweise  
        sub ipN2A {  
            my $ipN = shift;  
            return join(".", unpack("C4", pack("N", $ipN)));  
        }  
        ###################################################################################################  
        
        

        Hotte