Jak usunąć ogonki z polskich znaków używając perla

Edycja (2013-08-11): dodałem info o Windows.

Edycja (2013-09-28): dodałem info o konwersji pliku w UTF8 na Windows.

Zakładam, że używamy Linuksa na terminalu obsługującym UTF8. Testowane na perlu 5.18.0.

Nasz plik (polskie znaki w UTF8):

$ cat tmp.txt
ęóąśłźżćń ĘÓĄŚŁŹŻĆŃ
ĘÓĄŚŁŹŻĆŃ ęóąśłźżćń
W Strzebrzeszynie chrząszcz brzmi w trzcinie i Strzebrzeszyn z tego słynie.
Zażółć gęślą jaźń.

Jednolinijkowiec w perlu:

$ cat tmp.txt | perl -Mutf8 -MEncode -wple '$_=decode("utf8",$_);tr/ęóąśłźżćńĘÓĄŚŁŹŻĆŃ/eoaslzzcnEOASLZZCN/'
eoaslzzcn EOASLZZCN
EOASLZZCN eoaslzzcn
W Strzebrzeszynie chrzaszcz brzmi w trzcinie i Strzebrzeszyn z tego slynie.
Zazolc gesla jazn.

W Windows (XP PL; Activestate Perl 5.8.9) wystarczy (plik tmp.txt kodowany w lokalnym standardzie CP1250):

type tmp.txt | perl -wple "tr/ęóąśłźżćńĘÓĄŚŁŹŻĆŃ/eoaslzzcnEOASLZZCN/"

Okazuje się, że polskie znaki w wierszu poleceń Windows są w którymś miejscu niejawnie konwertowane do CP1250 (mimo że normalnie na konsoli obowiązuje CP852).

Konwersja pliku zapisanego w UTF8 (Notatnik umożliwia zapis w tym kodowaniu; dodaje wtedy też BOM na początku, więc trzeba go usunąć) wymaga nieco więcej zachodu…:

type tmp.txt | perl -MEncode=decode -wple "BEGIN { $pl='ęóąśłżźćńĘÓĄŚŁŻŹĆŃ';$pl=decode('CP1250', $pl); $bom = join'',map(chr,(0xef,0xbb,0xbf))} s/^$bom//; $_=decode('UTF8', $_); eval 'tr/' . $pl . '/eoaslzzcnEOASLZZCN/'"

eval pod koniec jest niezbędne, bo operator “tr” nie obsługuje normalnie zmiennych w listach do zamiany.
Testowane z ActiveState perlem 5.10.1 na Windows 7 Starter PL SP1 oraz ActiveState perlem 5.12.4 na Windows XP PL SP3.

Advertisements