Posso usare l'operatore y per eseguire una traslitterazione non uno-a-uno in Perl?
-
11-09-2019 - |
Domanda
L'operatore y in Perl esegue la traslitterazione carattere per carattere.Ad esempio, se inseriamo y/abc/dfg nella stringa "foobar", otteniamo "foofdr".Ma cosa succede se voglio traslitterare "ā" in "ei" e "ä" in "a:" e "ō" in "֙u" e "o" in "ɒ".
Ho provato la seguente riga di codice ma senza fortuna :(
y/āäōo/(ei)(a:)(әu)ɒ/
Speriamo di avere una soluzione alternativa a questo problema?Oppure devo utilizzare ripetutamente l'operatore s e fare molte sostituzioni complicate?
Grazie in anticipo per qualsiasi indicazione :)
Soluzione
In questo caso, crea un hash e passa facilmente dalle chiavi alle stringhe.
use warnings;
use strict;
use utf8;
binmode STDOUT, ":utf8";
my $string = "āäōo";
my %trans = qw/ā ei ä a: ō u o ɒ/;
my $keys = join '', keys %trans;
$string =~ s/([$keys])/$trans{$1}/g;
print "$string\n";
È necessario modificarlo se le chiavi sono lunghe più di un carattere ordinando le chiavi in ordine decrescente di lunghezza e unendole utilizzando ( | | )
invece di [ ]
.
Altri suggerimenti
Sembra che si sta cercando di fare qualcosa di simile a :: Unaccent :: PurePerl .