#!/usr/bin/env perl # # bsn2name - see http://nederl.blogspot.nl/2014/03/hier-is-uw-hbc-naam-draag-hem.html # # $Id$ use warnings; use strict; sub rev # given a list, yields its hash inverse { map { $_[$_] => $_ } 0 .. $#_; } my @v = qw(a e i o u y); # should be 'ij', really my %b = rev(qw(q x)); # banned my %v = rev(@v); my @c = grep { !defined( $v{$_} ) && !defined( $b{$_} ) } ( 'a' .. 'z' ); my %c = rev(@c); #warn "$_ => $c{$_}\n" for sort keys %c; my %num2syl; foreach my $n ( 1 .. 99 ) { my $r = $n % 11; my $d = ( $n - $r ) / 11; $num2syl{ sprintf( '%02d', $n ) } = !$r ? $c[ $d - 1 ] . $v[ $v{'y'} ] : ( $r < 6 ) ? $c[ $d * 2 ] . $v[ $r - 1 ] : $c[ $d * 2 + 1 ] . $v[ $r - 6 ]; } foreach my $d ( 1 .. 9 ) { $num2syl{$d} = $c[ $c{'l'} + $d ] . $v[ $v{'y'} ]; } $num2syl{'0'} = $num2syl{'00'} = 'qua'; #warn "$_ => $num2syl{$_}\n" for sort keys %num2syl; my @results; sub numbers2Word { #warn join(' ', 'the numbers are', @_, "\n"); map { s/./\u$&/; $_ } join( '', map { $num2syl{$_} } @_ ); } sub digits2name { my @numbers = $_[0] =~ /(..?)/g; my $split = @numbers - int( @numbers / 2 ); join( ' ', map { numbers2Word(@$_) } ( [ @numbers[ 0 .. $split - 1 ] ], [ @numbers[ $split .. $#numbers ] ] ) ); } while (<>) { my @words = /\d+/g or next; #warn join( @words ), "\n"; my @names = map { digits2name($_) } @words; s/y/ij/g for @names; # see above s/./\u$&/ for @names; # they're Names print join( ' ', @names ), "\n"; }