Calculate netmask in Perl

This is a small code snippet I wrote along time ago for a bigger framework I’ve created. No extra modules are required.
It calculates the netmask of a network based on the network address and network bit (CIDR notation).

#!/usr/bin/perl
use strict;
use warnings;

sub _calc_netmask {
    my($subnet) = @_;

    # e.g.: 10.0.0.0/24 192.168.1.0/16
    my($network, $netbit) = split /\//, $subnet;

    my $_bit         = ( 2 ** (32 - $netbit) ) - 1;
    my ($full_mask)  = unpack( "N", pack( "C4", 255,255,255,255 ) );
    my $netmask      = join( '.', unpack( "C4", pack( "N", ( $full_mask ^ $_bit ) ) ) );
    
    return $netmask;
}

foreach my $line (){
    chomp($line);
    printf "SUBNET: %18s | NETMASK: %15sn", $line, _calc_netmask($line);
}

__DATA__
10.0.0.0/24
192.168.1.0/27
195.94.76.0/29
172.16.0.0/17
172.19.0.0/16
1.0.0.0/8
2.0.0.0/12
4.0.0.0/13

It produces the following output:

$ perl netmask_calc.pl
SUBNET:        10.0.0.0/24 | NETMASK:   255.255.255.0
SUBNET:     192.168.1.0/27 | NETMASK: 255.255.255.224
SUBNET:     195.94.76.0/29 | NETMASK: 255.255.255.248
SUBNET:      172.16.0.0/17 | NETMASK:   255.255.128.0
SUBNET:      172.19.0.0/16 | NETMASK:     255.255.0.0
SUBNET:          1.0.0.0/8 | NETMASK:       255.0.0.0
SUBNET:         2.0.0.0/12 | NETMASK:     255.240.0.0
SUBNET:         4.0.0.0/13 | NETMASK:     255.248.0.0

Comments are closed.