Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Leading Zeros w/ increment

by idnopheq (Chaplain)
on Apr 05, 2001 at 01:53 UTC ( #69912=snippet: print w/replies, xml ) Need Help??
Description: This two minute, the chanting REALLY works, kind of script allows me to grab DB log files from a web server. 1, 01, 001, and 0001 are different and incremented. Let me know if I could improve this (I did start it as a one liner, though, so no error checking, etc.). Shows how to increment yet pad leading zeros as necessary.

Update : Modified this based on extremely's advice.

$Start = substr(++($Start="z$Start"),1);

This is the key.

#!/usr/bin/perl -w

use strict;
use LWP::Simple;

my $Pre   = $ARGV[0];      # the URL up to num FIXED
my $Post  = $ARGV[1];      # the URL after num FIXED
my $Start = $ARGV[2];      # starting num INC
my $Max   = $ARGV[3];      # ending num (by request)

until ( $Start > $Max ) {  # starting num until ending num
  my $Url = "$Pre$Start$Post";
  getstore ( 
  # below is where the magic happens
  $Start = substr(++($Start="z$Start"),1);
Replies are listed 'Best First'.
(GOLF)Re: Leading Zeros w/ increment
by extremely (Priest) on Apr 05, 2001 at 03:28 UTC
    I hate to "GOLF" this but I just had ta. Perl's magical increment was MADE for this sort of golf.
    $Max = $ARGV[3]; #no $Pad needed. And I added $Max until ( $Start > $Max ) { print "$Pre$Start$Post\n"; getstore ( $Url, "$Start$Post" ); $Start = substr(++($Start="z$Start"),1); } # or see it work with this one-liner... perl -e '$a="0035";until($a>50){print$a=substr(++($a="z$a"),1),$/}'

    $you = new YOU;
    honk() if $you->love(perl)

      THX, but the 'z' in the automagical increment line of wonder astounds me, but I think it's involved in the incrementation.

      This does break, though, if you no not need to pad : i.e. 1 to 20.


        If you don't need to pad then $count++ works fine. The trick to this all is that perl's ++ is magical on some strings. Try these:
        my ($a, $b, $c, $d, $e) = ("aaa", "ab000", "123", "00123", "321ba",); $a++; $b++; $c++; $d++; $e++; print "a=$a\nb=$b\nc=$c\nd=$d\ne=$e\n"

        You'll notice when you run those that $e gets chopped to just numbers. In fact, my stunting isn't really necessary since perl will happily leave the "00" on the front of $d! The only trick to it is never treating $d as a number. Look at this:

        # now that is golfing. perl -e '$a="0035";until("$a">50){print++$a,$/}'

        Cute huh? Perl is like a squirrel's nest. Good stuff is everywhere but most of it is nuts...

        Your code could be re-updated to have quotes around "$String" in the comparison for the loop and just have $String++ where the "magical" part was. Sad that I didn't even know how slick it was. My stunt kept the comparison from blasting the string but it is better just to never treat it numerically.

        $you = new YOU;
        honk() if $you->love(perl)

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://69912]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (5)
As of 2020-11-26 12:03 GMT
Find Nodes?
    Voting Booth?

    No recent polls found