use List::Util "sum"; sub ip2rgb { my @ip = shift =~ /(\d+)/g; my $r = eval "@{[ join '^', @ip ]}"; my $g = sum(@ip) % 255; # left-overs my ( $b ) = sort @ip; # lowest of group print "$r, $g, $b"; } # ip2rgb '220.17.120.164' --> 17, 11, 120 # ip2rgb '127.0.0.1' --> 126, 128, 0