Peter’s blog ✴ Week 110 ✴ 26 April 2021

THE WEEKLY CHALLENGE
Good phones, phones good

The Perl Camel

Task 1

Valid phone numbers

You are given a text file. Write a script to display all valid phone numbers in the given text file.

Valid phone numbers have one of 3 possible formats:

  • +nn nnnnnnnnnn
  • (nn) nnnnnnnnnn
  • nnnn nnnnnnnnnn

Examples


Input:
0044 1148820341
 +44 1148820341
  44-11-4882-0341
(44) 1148820341
  00 1148820341
Output:
 0044 1148820341
 +44 1148820341
(44) 1148820341

Analysis

This is just a case of matching against 3 regexes. I allowed leading and trailing spaces, and more than one space where the allowed format has a single space, but output the numbers left justified and with single spaces where allowed.

Having coded this in real life I know that the range of valid UK phone numbers is somewhat larger than stated, and the number of formats encountered in a database where the field accepted any number of any characters is vastly larger.

I am sorry that the 'Try it' feature is currently working very slowly or not at all owing to some issue with my web hosting provider.

Try it 

Try running the script with any input:



example: 0044 1712221234

Script


#!/usr/bin/perl

# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge

use v5.26;    # The Weekly Challenge - 2021-04-26
use utf8;     # Week 110 - task 1 - Valid phone numbers
use warnings; # Peter Campbell Smith
binmode STDOUT, ':utf8';
use Encode;

valid_phone_numbers();

sub valid_phone_numbers {
    
    my ($phone);
    
    # initialise
    $phone = <DATA>;
    chomp $phone;
    say $phone;
    
    # check for valid format
    while ($phone = <DATA>) {
        say $1 if ($phone =~ m|^\s*(\+\d\d\s+\d+)\s*$|
                or $phone =~ m|^\s*(\(\d\d\)\s+\d+)\s*$|
                or $phone =~ m|^\s*(00\d\d\s+\d+)\s*$|);
    }
}

__DATA__
0044 1148820341
 +44 1148820341
  44-11-4882-0341
(44) 1148820341
  00 1148820341
  

15 lines of code
Completed after the closing date and not submitted to GitHub

Output from script


Input:
0044 1148820341
+44 1148820341
44-11-4882-0341
(44) 1148820341
00 1148820341

Output:
0044 1148820341
+44 1148820341
(44) 1148820341

 

Any content of this website which has been created by Peter Campbell Smith is in the public domain