in reply to Negative Index with "substr" Not Working

Another way:

c:\@Work\Perl\monks>perl -wMstrict -le "for my $s (qw(15556667777 3334445555 999999999 88888888 121212121 +212)) { printf qq{'$s' -> }; my ($npa, $nxx) = $s =~ m{ \A 1? (\d{3}) (\d{3}) \d{4} \Z }xms; print defined($nxx) ? qq{npa '$npa', nxx '$nxx'} : 'invalid number' +; } " '15556667777' -> npa '555', nxx '666' '3334445555' -> npa '333', nxx '444' '999999999' -> invalid number '88888888' -> invalid number '121212121212' -> invalid number
Please see perlre, perlretut, and perlrequick.

Update: This approach to parsing is open to further regexish elaboration (I took a quick look at WP for NPA and NXX definitions, but I'm sure it's more involved):

c:\@Work\Perl\monks>perl -wMstrict -le "my $rx_npa = qr{ [2-9] (?! 11) \d\d }xms; my $rx_nxx = qr{ [2-9] (?! 11) \d\d }xms; my $rx_subs = qr{ \d{4} }xms; ;; for my $s (qw( 15556667777 x15156667777 15516667777x x15556167777x 3334415555 x3134145555 3314415555x x3334445555x 999999999 x999999999 999999999x x999999999x 88888888 x88888888 88888888x x88888888 121212121212 x121212121212 121212121212x x121212121212x 5119999999 15119999999 9995119999 19995119999 )) { printf qq{'$s' -> }; my $got_pn = my ($npa, $nxx, $subs) = $s =~ m{ (?<! \d) 1? ($rx_npa) ($rx_nxx) ($rx_subs) (?! \d) }xms; print $got_pn ? qq{npa '$npa', nxx '$nxx', subscriber '$subs'} : 'n +o number'; } " '15556667777' -> npa '555', nxx '666', subscriber '7777' 'x15156667777' -> npa '515', nxx '666', subscriber '7777' '15516667777x' -> npa '551', nxx '666', subscriber '7777' 'x15556167777x' -> npa '555', nxx '616', subscriber '7777' '3334415555' -> npa '333', nxx '441', subscriber '5555' 'x3134145555' -> npa '313', nxx '414', subscriber '5555' '3314415555x' -> npa '331', nxx '441', subscriber '5555' 'x3334445555x' -> npa '333', nxx '444', subscriber '5555' '999999999' -> no number 'x999999999' -> no number '999999999x' -> no number 'x999999999x' -> no number '88888888' -> no number 'x88888888' -> no number '88888888x' -> no number 'x88888888' -> no number '121212121212' -> no number 'x121212121212' -> no number '121212121212x' -> no number 'x121212121212x' -> no number '5119999999' -> no number '15119999999' -> no number '9995119999' -> no number '19995119999' -> no number


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

Replies are listed 'Best First'.
Re^2: Negative Index with "substr" Not Working
by grasshopper!!! (Beadle) on Nov 23, 2015 at 22:47 UTC

    Try regex

    sub test { my $str =shift; if(length($str)==11) { $str=~ m/^(\d(\d{6})\d+)$/; print"$1 $2\n"; } else { $str=~ m/^((\d{6})\d+)$/; print"$1$2 $2\n"; } } my $a='01234567890'; my $b ='15556667777'; test($a); test($b);

    Output 01234567890 123456
    15556667777 555666

      Be careful with (ie. don't use) the $a and $b operands... they are special to perl.

      my $x ='01234567890'; my $y ='15556667777'; test($x); test($y);