Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

Leading Zeros w/ increment

by idnopheq (Chaplain)
on Apr 05, 2001 at 01:53 UTC ( [id://69912]=CUFP: print w/replies, xml ) Need Help??

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 #-*-perl-*- 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 ( $Url, "$Start$Post" ); # 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.

      Thoughts?
      Dex

        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?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (3)
As of 2024-12-07 16:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Which IDE have you been most impressed by?













    Results (50 votes). Check out past polls.