in reply to regex renaming with existing files

first thing i see is your counter. i could be way off, but you declare my $counter++ without assigning a value to $counter.
use strict; use warnings; my $existingFile; my $filename; print "provide filename: "; $existingFile = <STDIN>; $filename = "folder1"; chomp $existingFile; chomp $filename; my $counter = 1; #declare counter if (-e $filename) { print "File Exists! Renaming with .[x]\n"; $counter++; #increment already declared counter with value +assigned rename "$existingFile", "$filename.[$counter]"; } else { rename "$existingFile", "$filename"; } exit;
its a basic counter. you can also put in two counters and rename both sides of the if statement. there is also File::Find and its pretty easy to adjust to :)

EDIT: changed "my $counter = '1';" to "my $counter = 1;"

Replies are listed 'Best First'.
Re^2: regex renaming with existing files
by GrandFather (Saint) on Nov 04, 2014 at 09:47 UTC

    Hmm, not such a good illustration. You initialise $counter with the string '1', not with the number 1. Perl is smart enough to Do What You Mean, but you are telling people who read your code the wrong thing.

    You have also carried over the OP's bad habit of needlessly interpolating variables into strings. Using interpolation for "$filename.[$counter]" is appropriate but elsewhere you should simply use the variable: rename $existingFile, $filename.

    If there is no algorithmic reason to use the post increment operators, always use pre increment. Sticking the ++ or -- out the front (++$counter) makes them easier to see which is a Good Thing.

    Perl is the programming world's equivalent of English
      ah ok, i did not even know you could put ++ or -- on the opposite side. also ill change '1' to 1 so it is a better example.

        There is a very important difference between pre increment and post increment operators. Consider:

        use strict; use warnings; my $counter = 1; print "With ++\$counter was 1 and returns ", ++$counter, "\n"; print "\$counter now contains: $counter\n\n"; $counter = 1; print "With \$counter++ was 1 and returns ", $counter++, "\n"; print "\$counter now contains: $counter\n";

        Prints:

        With ++$counter was 1 and returns 2 $counter now contains: 2 With $counter++ was 1 and returns 1 $counter now contains: 2

        See it? With pre increment (++$counter) the increment happens before the value is returned so you get the updated value. With post increment the value before incrementing is returned. If you are not using the returned value it doesn't matter which version you use in terms of how the code works, but it does make a difference to how easily the code is understood. Because we tend to take more notice of the first things on a line sticking the operator out the front makes it more visible and thus easier to understand.

        Perl is the programming world's equivalent of English
        Thank you for your reply. I however was having the same issue after assigning $counter = 1 & ++$counter. I then created a for loop, as following, and now it's working as I wanted-
        # replaced $counter with $i. for ($i=1; $i<10; $i++){ ........... }
        Result: folder1, folder1.[1], folder1.[2], folder1.[3]...etc.