in reply to displaying numbers like 001

I'd personally go with a (s)printf approach, but the example you gave wasn't clear what base you intended these numbers to be -- all of the examples you gave only used the characters 0,1 and 2.

If you tried loading those numbers into strings, and then print them, they'll get translated to base 10. If you have them unquoted, they'll be translated as base 8, because Perl uses the leading 0 to mark octal numbers:

printf "%03d\n", '020'; # prints 020 printf "%03d\n", 020 ; # prints 016 printf "%03o\n", 020 ; # prints 020 printf "%03o\n", '020'; # prints 024

Replies are listed 'Best First'.
Re^2: displaying numbers like 001
by jdporter (Paladin) on Jul 17, 2005 at 21:18 UTC
    I think you've all missed the point. The OP wants to display numbers in base 3.

      I wondered about that myself, at first - but the OP said "001 002...010 011 012..020", suggesting that there were ranges desired between 002 and 010 and between 012 and 020. In base 3, there is nothing in those ranges.

      update: just for fun, here's a solution to the base-3 problem. I dispose of the 0 padding in this case, because three places doesn't buy you much in base-3.

      use strict; use warnings; sub base3 { my $num = shift; my @res; do { unshift @res, ( $num % 3 ) } while ( $num = int( $num / 3 ) ); return join '', @res; } print base3( 65 ); __END__ 2102

      Obviously in the real world, you would do some input checking, and likely factor out the constant base. It feels like there should be a way to do this with pack...