I’m going to embarrass myself today, and post some hack-ish Perl code using recursion. Actually, because the code is only 35 lines, I think it turned out actually fairly well, but as I am a Perl n00b, I am sure that the experts out there will disagree with the quality of the code.
First and foremost, I have a global variable used as a counter. I know that this is a BIG NO-NO, but, because the code is only 35 lines in length, I’m not too worried. I do recognize, though, that passing the counter by reference through the recursive function PrintFiles() would probably be the better way to handle that, but then, that’s just making things a bit more difficult than I care at this point.
What does the program do? It should be fairly obvious: it runs through a root directory structure, looking for OGG Vorbis files, counting them, and printing the results to another text file for inventory. Basic, gets the job done, and without a lot of fanfare. The code should be self-evident, but I’m anal about commenting code, so redundant comments are placed throughout. The program was just an exercise for me to:
- Increase my ability to do simple recursion.
- Learn recursion using Perl.
- Create an inventory of my music.
Anyway, here’s the code:
open(OUT, ">oggfiles.txt"); # Create the file to read to
$counter = 0; # Global variable (no-no)!! :)
sub PrintFiles # Recursive function for printing dir contents
my ($indent) = @_; # Keep track of indentation
opendir(MD, "./"); # Start looking through local directory
foreach my $file (sort readdir MD) # Start a loop going through each dir sorted
unless($file =~ m/^\./ || $file =~ m/^ogg/) # Prevent an infinite loop, don't worry about hidden (.*), oggdir.pl and oggfiles.txt files
$counter++ if $file =~ m/\.ogg$/; # Keep a counter for every ogg file
print OUT $indent . $file . "\n"; # Print dir contents to a file
if (-d $file) # If a directory
chdir $file; # Change to the directory
PrintFiles("$indent "); # Call the recursive function again, incrementing the ident
chdir "../"; # Change back
closedir(MD); # Close the dir
PrintFiles(""); # First call of the recursive function, with no spaces for indentation
print OUT "\nCurrent number of music files: " . $counter . "\n\n";
close(OUT); # Close file written to