#!/usr/bin/perl -w # counts the instances of each character in the file specified. my %ascii_counts = (); my @keys = keys(%ascii_counts); my @values = values(%ascii_counts); my $total_chars; while (1) { # program's main loop &init_hash(); &fill_hash(); &clean_hash(); &print_hash(); } # Subroutines ========================================================== sub init_hash { # foreach ascii character add it to the hash with count = 0 foreach $i (0..255) { $ascii_counts{ord($i)} = 0; } } sub fill_hash { # get filename print "Enter 'ls' or a filename to scan: "; my $file_name = shift || ; while ($file_name =~ m/^ls/) { system("$file_name"); print "\nEnter 'ls' or a filename to scan: "; $file_name = ; } # open file open(INFILE, $file_name) or warn &fill_hash(); # iterate through lines/characters incrementing the key's value while (my $l = ) { my @line = split(//, $l); foreach $char (@line) { $ascii_counts{$char}++; } } # close file close(INFILE); } sub clean_hash { while (my ($key, $value) = each(%ascii_counts)) { # remove keys with value == 0 if ($value == 0) { delete($ascii_counts{$key}); } # remove non-alpha-numeric keys elsif ($key =~ /\W/) { delete($ascii_counts{$key}); } } # store the key/value pairs sorted for later use @keys = sort(keys(%ascii_counts)); @values = sort(values(%ascii_counts)); # determine total number of values $total_chars = 0; foreach $x (@values) { $total_chars += $x; } } sub print_hash { print "\n[key]\t[count]\t[%]\n\n"; foreach my $key (@keys) { my $value = $ascii_counts{$key}; my $percent = $value/$total_chars*100; print " $key\t$value\t$percent\n"; } print "\nTotal: $total_chars characters.\n\n"; }