Gossamer Forum
Home : General : Perl Programming :

Help with project

Quote Reply
Help with project
I'm taking an introductory course into computer programming and I needed to write a Perl program for renaming files in a specified directory according to regular expression search and replace patterns given on the command line.

Has to support 4 optional command line flags -f, -u, -d, and -q to modify it's behavior. I made an error somewhere along the way, and I need someone to help me since I'm not a programmer at all :)

Here's the code, if anyone could fix it or write it in a different way of performing the task I'd greatly appreciate it. If not that's ok :). Here's what I wrote...

Code:
@args = ();
$forceFlag = 0; # -f
$upcaseFlag = 0; # -u
$lowcaseFlag = 0; # -d
$quietFlag = 0; # -q

$error = 0;
# iterate through the arguments
foreach $arg ( @ARGV )
{
$first = substr($arg, 0, 1);
if ($first eq "-")
{
# we've found one or more switches
foreach $letter ( split('',$arg) )
{
if ( $letter eq '-' )
{
# do nothing
}
elsif ( $letter eq 'f' )
{
$forceFlag = 1;
}
elsif ( $letter eq 'u' )
{
$lowcaseFlag = 0;
$upcaseFlag = 1;
}
elsif ( $letter eq 'd' )
{
$upcaseFlag = 0;
$lowcaseFlag = 1;
}
elsif ( $letter eq 'q' )
{
$quietFlag = 1;
}
else
{
print "Invalid switch -$letter\n";
$error = 1;
}
}
}
else
{
# we've found an argument
push(@args, $arg)
}
}
if ( $error )
{
exit(1);
}

$numArgs = $#args + 1;

if ( $numArgs < 1 )
{
print "Error: no directory specified.";
exit(1);
}
else
{
$searchDir = $args[0];
}

if ( $numArgs < 2 )
{
print "Error: no search pattern specified.\n";
exit(1);
}
else
{
$searchPattern = $args[1];
}

if ( $numArgs == 3 )
{
$replacePattern = $args[2];
}

$totalfiles = 0;
$validfiles = 0;

opendir(D, $searchDir);
@files = readdir(D);
closedir(D);
foreach $file (@files)
{
my $filename = $file;
my $originalName = $filename;
if ($file eq '.' || $file eq '..' || -d $file)
{ }
else
{
if ( $filename =~ /$searchPattern/ )
{
$totalfiles++;
if ( $upcaseFlag )
{
$filename = uc($filename);
}
if ( $lowcaseFlag )
{
$filename = lc($filename);
}
}
my $resultName;
if ( $replacePattern )
{
$resultName = renameFile($searchPattern, $replacePattern, $filename);
}
else
{
$resultName = $filename;
}
if ( $resultName ne $originalName )
{
$validfiles++;
if ( $forceFlag )
{
rename($searchDir . '/' . $originalName, $searchDir . '/' . $resultName);
}
if ( !$quietFlag )
{
print $searchDir . '/' . $originalName . " -> " . $searchDir . '/' . $resultName . "\n";
}
}
}
}

if ( $forceFlag )
{
print "$validfiles file(s) were renamed out of $totalfiles file(s) that matched the search pattern.\n";
}
else
{
print "$validfiles file(s) could be renamed out of $totalfiles file(s) that matched the search pattern.\n";
}


sub renameFile
{
my $searchPattern = shift;
my $replacePattern = shift;
my $filename = shift;
$filename =~ s/$searchPattern/$replacePattern/g;
return $filename;
}
Quote Reply
Re: [azonic] Help with project In reply to
Could this be wrong with the empty brackets? I 'm not very good myself mind, but brackets have been a problem to me several times.

if ($file eq '.' || $file eq '..' || -d $file)
{ }
else