Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

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
#-*-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);
}
Comment on Leading Zeros w/ increment
Download Code
(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)

Back to Snippets Section

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (10)
As of 2015-07-06 11:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (72 votes), past polls