in reply to Regex to zero suppress

See perlre. It notes that
\G Match only where previous m//g left off (works only with /g)
Try the following:
perl -e "$num = \"0000012345\"; $num =~ s/\G0/ /g;print $num"

Cheers,
Ovid

Update: Just saw merlyn's response and wanted to note that I have Effective Perl Programming. Where the heck do you think I got that regex? :)

Join the Perlmonks Setiathome Group or just click on the the link and check out our stats.

Replies are listed 'Best First'.
Re (tilly) 2: Regex to zero suppress
by tilly (Archbishop) on Dec 29, 2000 at 21:55 UTC
    Just tried that with "0.5"" and didn't like the result. For a fix make the substitution the not quite so nice:
    s/\G0(?=\d)/ /g;
    Update
    Fixed the RE for the common case of '0' as well...
Re: (Ovid) Re: Regex to zero suppress
by merlyn (Sage) on Dec 29, 2000 at 20:20 UTC
    $num =~ s/\G0/ /g;
    Ahh yes. I remember creating that in response to a similar question a few years ago in comp.lang.perl.misc, and then Joseph copied it for his Effective Perl Programming book, and now it's become part of the culture. Not quite as impactful as the Schwartzian Transform, but I remember getting a few "ooohs" and "aaaahs" over the simplicity of that.

    -- Randal L. Schwartz, Perl hacker

Re: (Ovid) Re: Regex to zero suppress
by mkmcconn (Chaplain) on Dec 30, 2000 at 09:43 UTC

    Please take the following with a grain of salt. Ovid has already given the best answer.
    It makes me wince, now, but it was actually used in production to strip leading zeros from numbers in a list, in the first real Perl program I ever wrote.

    #!/usr/bin/perl -w @numberarray = qw(00000900011 10001000100 00022200101); for $digits (@numberarray){ @temparray = split (//,$digits); $incr=0; while ($temparray[0] eq 0) { shift @temparray; $incr++; } unshift (@temparray," "x$incr); $digits = join('',@temparray); print "$digits\n"; }

    I couldn't discover a better way than to shift out the zeroes and unshift the replacing text, then join the result together.
    It isn't pretty, but, as far as I can tell, it doesn't break.

    mkmcconn
    novice


    Update:
    And now, a monk, I never would have posted this (wonderful what a few weeks at perlmonks can do), but if I had, I would have suggested to novice mkmcconn that even taken with a grain of salt, numerous difficulties in his solution could be avoided by writing it this way:

    #!/usr/bin/perl -wl use strict; my @numberarray = qw(000000 000002 001110 010201 010010 001000 0001 +20 010030); for (@numberarray){ next if $_ == 0; my @array = split //; my $incr = 0; while ($array[0] eq 0) { shift @array; $incr++; } unshift (@array,"\x20" x $incr); print @array; }
    And then would have advised him (as a friend) of the topical difference between "Regex to zero suppress" and "Subroutine to remove zero-padding".

    It will be interesting to find out what advice I might give myself someday, about this update.
    mkmcconn