The goal for this Programming Praxis was to implement the Unix wc function. This one took me a couple days (I haven’t had a lot of time recently) to complete, but I finally finished it and this it works pretty good. It’s not a drop in replacement for wc, but it works – a programmers solution: by programmers, for programmers.
use Switch;
#print "arg num ". $#ARGV;
if ($#ARGV == -1) {
usage();
}
@option;
@input;
#check first char of each argument
foreach $arg (@ARGV){
if($arg =~ m/-.*/){
@option = split //, $arg;
#print "!".$arg."\n";
}
else{
push(@input, $arg);
}
}
#remove the "-" from the array
shift(@option);
foreach $input (@input){
if(-e $input){
#file exists, continue
local( *FH ) ;
open( FH, $input ) or die "sudden flaming death\n";
$file = do { local( $/ ) ; <FH> };
$fileSize = (-s $input);
close(FH);
}else{
die("No such file or directory");
}
print "$input ";
foreach $flag (@option){
switch ($flag){
case "c" {print "$fileSize "}
case "m" {print length($file) . " "}
case "l" {print $file =~ s/((^|\s)\S)/$1/g ." "}
case "L" {print maxLineLength($input)." "}
case "w" {print $file =~ s/(\n)/$1/g . " "}
else {die ("invalid option -- $flag")}
}
}
print "\n";
}
sub maxLineLength($input){
my($thisInput) = @_;
open(FH, $thisInput);
$maxLine = 0;
foreach $line (<FH>){
if(length($line) > $maxLine){
$maxLine = length($line);
}
}
return $maxLine;
}
sub usage{
print "Usage: wc [OPTION]... [FILE]...\n";
print " or: wc [OPTION]... --files0-from=F\n";
print "Print newline, word, and byte counts for each FILE, and a total line if\n";
print "more than one FILE is specified. With no FILE, or when FILE is -,\n";
print "read standard input.\n";
print " -c print the byte counts\n";
print " -m print the character counts\n";
print " -l print the newline counts\n";
print " -L, --max-line-length print the length of the longest line\n";
print " -w, --words print the word counts\n";
}
I’m glad you enjoy Programming Praxis. Perhaps in the future you could post your solutions in the comments there, or at least post a link back to your solution here, so that other readers of Programming Praxis can easily compare your solution to theirs.
Curious, it should have automatically left a ping back.
It did. I missed it under a mound of code. Sorry.