Posso usare l'operatore y per eseguire una traslitterazione non uno-a-uno in Perl?

StackOverflow https://stackoverflow.com/questions/1837814

  •  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 :)

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top