in reply to efficiency & style

Looking at the contents of /proc/net/tcp it appears to be a formatted report. Personally I would first do a sanity check that I know what the header line is (makes porting the code later easier) then just extract substrings using substr or unpack and do hash lookups for the action. Much more efficient than looping.
#! /usr/bin/perl -w use strict; @tcp_status = `cat /proc/net/tcp`; unless (" st " eq substr($tcp_status[0], 33, 4) and " rem_address " eq substr($tcp_status[0],19, 15)) { die "/proc/net/tcp has an unexpected format"; } my %service = qw( 0050 www 0016 ssh 1A0B irc 0015 ftp ); my %count = map {($_, 0)} values %service; foreach my $line (@tcp_status) { if ("01" eq substr($line, 34, 2)) { my $serv_code = substr($line, 29, 4); if (exists $service{$serv_code}) { ++$count{$service{$serv_code}}; } } } # Finish as Tye did
(These numbers are for a 2.0 series Linux kernel.)