Sortieren von IP-Adressen

Haeufig kommt es vor, dass man eine Liste von IP-Adressen sortieren muss.

Dabei ist es hilfreich, sich zu vergegenwaertigen, dass IPs (bei IPv4) aus 4 Bytes bestehen. Also kann man jede IP auch durch eine Zahl darstellen. Wenn 5.6.7.8 die IP-Adresse ist, kann man sie auch in dieser Form schreiben 5*256*256*256 + 6*256*256 + 7*256 + 8, mit anderer Klammerung ergibt sich (((5*256 + 6)*256 + 7)*256 + 8) oder auch 84281096.

Zureck zur IP geht es mit ganzzahliger Division und Restwertberechnung:

$ bc
84281096 % 256
8
84281096 / 256
329223
329223 % 256
7
329223 / 256
1286
1286 % 256
6
1286 / 256
5

Darum sollte es aber gar nicht gehen ;-) Dieses kleine Perl-Skript nimmt eine Liste von IP-Adresse vom Standard-Eingabekanal STDIN und gibt die Liste sortiert an STDOUT (Standardausgabekanal) aus:

#!/usr/bin/perl
use warnings;
use strict;
sub ip_vergleich {
	my @ip1 = split /\./,$a ;
	my @ip2 = split /\./,$b ;
	my $i1 = (($ip1[0]*256 + $ip1[1])*256 + $ip1[2])*256 + $ip1[3];
	my $i2 = (($ip2[0]*256 + $ip2[1])*256 + $ip2[2])*256 + $ip2[3];
	return $i1 <=> $i2;
}
my @sorted = sort ip_vergleich (<STDIN>);
map { print } @sorted;

Fragen? Fragen!

Zurück zur Uebersicht