A perl решение на основе:
#!/usr/bin/env perl
use warnings;
use strict;
use autodie;
use feature qw/say/;
use open qw/:std :locale/;
my @mappings;
open my $file, "<:encoding(UTF-8)", $ARGV[0];
while (my $line = <$file>) {
chomp $line;
push @mappings, [ split /\t/, $line ];
}
close $file;
@mappings = sort { my $x = length $b->[0] <=> length $a->[0];
$x != 0 ? $x : $a->[0] cmp $b->[0] } @mappings;
# Precompile the regular expressions
@mappings = map { [ qr/\b$_->[0]\b/, $_->[1] ] } @mappings;
open $file, "<:encoding(UTF-8)", $ARGV[1];
while (my $line = <$file>) {
my $output;
chomp $line;
for my $pair (@mappings) {
my ($roman, $devnagari) = @$pair;
$line =~ s/$roman/$devnagari/g;
}
say $line;
}
File_A и File_B передаются в командной строке соответственно:
$ perl convert.pl file_a.txt file_b.txt
ड ो ना ल द स
Простой метод грубой глобальной подстановки не работает потому что, скажем, a
является отдельной фонемой и частью многих более длинных. Если вы отсортируете список фонем так, чтобы сначала проверялись самые длинные токены (чтобы c a
соответствовало до c
независимо от порядка их появления в File_A), становится разумнее использовать этот подход. Вы также можете попытаться найти самую длинную возможную фонему в начале текста, вытолкнуть ее и повторять до тех пор, пока не будет использована вся входная строка.