#!/usr/bin/perl use strict; use warnings; my @Source_Files; my @Directories; my $Regex; my $Top_Dir; sub Initialize { if ( @ARGV ) { $Top_Dir = pop @ARGV; } else { $Top_Dir = "."; } if ( @ARGV ) { $Regex = pop @ARGV; } else { $Regex = '\.(?:plx|c(pp)?|h|bat)$'; } push @Directories, $Top_Dir; } sub Get_Files { opendir my $Directory, $_[0] or die "Couldn't open $_[0]: $!\n"; my @File_List = grep !/^\./, readdir $Directory; for (@File_List) { $_ = $_[0]."/".$_; } return @File_List; } sub Sort_Files { for (@_) { if ( -d $_ ) { push @Directories, $_; } elsif ( $_ =~ /$Regex/ ) { push @Source_Files, $_; } } return 1; } sub Count_Source { my $Total = 0; my @Source_Counts; for (0..$#Source_Files) { open my $file, "<", $Source_Files[$_] or die "Couldn't open $Source_Files[$_]: $!\n"; $Source_Counts[$_] = 0; while ( my $line = <$file> ) { $Total++; $Source_Counts[$_]++; } } push @Source_Counts, $Total; return @Source_Counts; } sub Print_Results { my $Total_Lines = pop @_; for (0..$#Source_Files) { print "$Source_Files[$_]: $_[$_]\n"; } print "Total Lines: $Total_Lines\n"; } { Initialize; while ( @Directories ) { my $Current_Directory = pop @Directories; Sort_Files ( Get_Files ( $Current_Directory ) ); } Print_Results ( Count_Source ); }