kgherman has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

If I have a string in perl, say 'data12.csv', I know I can remove the nun-numbers by using

#!/usr/bin/perl my $string=('data12.csv'); $string=~ s/\D//g; print "$string\n";

which returns 12. However, when I get a string 'data.csv' the previous lines of code return, not surprisingly, nothing. How can I tell perl to return, in such case, 0?

Replies are listed 'Best First'.
Re: How to remove non-numbers from string
by Laurent_R (Canon) on Jun 21, 2015 at 20:39 UTC
    Perhaps something like this:
    #!/usr/bin/perl my $string=('data12.csv'); $string=~ s/\D//g; $string = 0 if $string eq ''; print "$string\n";

      Or even:

      c:\@Work\Perl\monks>perl -wMstrict -le "my $string = 'data.csv'; $string =~ s/\D//g; $string ||= 0; print qq{'$string'}; " '0'


      Give a man a fish:  <%-(-(-(-<

      hum... I wonder why didn't I think about this way? Thank you, works great!
Re: How to remove non-numbers from string
by stevieb (Canon) on Jun 21, 2015 at 20:52 UTC

    Here's one way using a subroutine and the ternary operator. It will return $str if $str isn't empty, and if it is, returns 0.

    #!/usr/bin/perl use warnings; use strict; my $string = "data.csv"; my $return = num($string); sub num { my $str = shift; $str =~ s/\D//g; return $str ? $str : 0; }

    Or without the sub:

    my $str = "data.csv"; $str =~ s/\D//g; $str = $str ? $str : 0; print $str;

    -stevieb

Re: How to remove non-numbers from string
by ww (Archbishop) on Jun 21, 2015 at 21:09 UTC

    UPDATE: Sound enough code (and can be adapted (below) to OP's needs), but NOT a complete answer to OP's question, which I mis-read.

    Use the inverse of your regex, namely:

    $string=~ s/\d//g;

    like this without having to add additional tests to deal with strings which have no numbers:

    C:\>perl -E "my $string=('data12.csv');$string=~ s/\d//g;say $string; data.csv C:\>perl -E "my $string=('data.csv');$string=~ s/\d//g;say $string;" data.csv

      Illustration of adaptation (see the parent, Re: How to remove non-numbers from string)

      #! /usr/bin/perl use 5.018; use strict; use warnings; my @strings=('data.csv', 'data12.csv', '123data.csv', 'data000.csv', ' +data.csv0', '123.', '1data2.csv'); for my $string(@strings) { if ( $string =~ /(\d+)/g ) { my $revised = $1; say "\$string was:\t$string;\t RESULT: $revised (from Ln 11)"; } else { # i.e., if there are no digits my $revised = "0"; say "\$string was:\t$string; \t RESULT: $revised (from Ln 14)" +; } } =head C:\>1131407.pl $string was: data.csv; RESULT: 0 (from Ln 14) $string was: data12.csv; RESULT: 12 (from Ln 11) $string was: 123data.csv; RESULT: 123 (from Ln 11) $string was: data000.csv; RESULT: 000 (from Ln 11) $string was: data.csv0; RESULT: 0 (from Ln 11) #problem1 $string was: 123.; RESULT: 123 (from Ln 11) $string was: 1data2.csv; RESULT: 1 (from Ln 11) #problem2
      • # problem1: How do you want to distingush this (or 'data0.csv') from an element with no zeros?
      • # problem2: ... and what about an element with more than one set of digits, such as "1data2.csv"

      ++$anecdote ne $data (nor does it eq code)

Re: How to remove non-numbers from string
by Anonymous Monk on Jun 21, 2015 at 20:39 UTC
    numify the string, $string += 0;

      Problematic with warnings enabled:

      c:\@Work\Perl\monks>perl -wMstrict -le "my $string = 'data.csv'; $string =~ s/\D//g; $string += 0; print qq{'$string'}; " Argument "" isn't numeric in addition (+) at -e line 1. '0'


      Give a man a fish:  <%-(-(-(-<

        Yes, I have just encountered this very same problem!
      Great idea; thank you!