in reply to Re: regex renaming with existing files
in thread regex renaming with existing files

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

Replies are listed 'Best First'.
Re^3: regex renaming with existing files
by james28909 (Deacon) on Nov 04, 2014 at 10:24 UTC
    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.

        Show us the actual code you tried and tell us what issue you saw. $counter = 1 & ++$counter is rather unlikely code and probably doesn't do anything like what you expect, although it's hard to tell what you expect.

        Don't use the C style for loop. Instead use:

        for my $counter (1 .. 9) { ... }

        which is much clearer and a lot harder to get wrong.

        Perl is the programming world's equivalent of English