extract-tex.pl: Informativere Variablennamen.
[wortliste.git] / skripte / wortliste / extract-tex.pl
blob7a4c2a829eccfa9db2f29dde3f48c6c295387e77
1 #! /usr/bin/perl -w
3 # extract-tex.pl
5 # Dieses Perl-Skript extrahiert einfache Wortlisten aus der
6 # »wortliste«-Datenbank im Langformat (oder ähnlichen Dateien mit
7 # gleichem Dateiformat), die beispielsweise als Eingabedateien für
8 # »patgen« verwendet werden können.
10 # Aufruf:
12 # perl extract-tex.pl [Optionen...] [Liste1 Liste2 ...] > input.patgen
14 # Die Eingabedateien müssen in UTF-8 kodiert sein; ist keine
15 # Eingabedatei angegeben, verwendet das Skript die Standardeingabe.
16 # Beispiele:
18 # perl extract-tex.pl -l < ../wortliste > wortliste.ref.latin9
19 # perl extract-tex.pl -t ../wortliste > wortliste.trad.utf8
21 # Die Aufrufe
23 # perl extract-tex.pl -1 ...
24 # perl extract-tex.pl -t -1 ...
25 # perl extract-tex.pl -s -1 ...
26 # perl extract-tex.pl -G -S ...
28 # liefern jeweils die gleiche Ausgabe wie
30 # sprachauszug.py -l de-1996,de-1996-x-versal ...
31 # sprachauszug.py -l de-1901,de-1901-x-versal ...
32 # sprachauszug.py -l de-CH-1901,de-1901 ...
33 # sprachauszug.py -l de-1996,de-1996-x-versal \
34 # -s morphemisch,keine_schwankungsfaelle,einfach ... [*]
36 # [*] »sprachauszug.py« gibt hier zusätzlich auch Wörter mit
37 # Mehrdeutigkeiten aus.
40 # Optionen
41 # --------
43 # -t
44 # -s Option »-t« wählt die traditionelle deutsche Rechtschreibung
45 # aus, Option »-s« die traditionelle (deutsch)schweizerische
46 # Rechtschreibung. Wenn weder »-s« noch »-t« gesetzt ist, wird
47 # die reformierte deutsche Rechtschreibung ausgewählt.
49 # -G Gib zusätzlich Gesangstrennstellen aus, z.B. »A-bend«, wobei
50 # Ungünstigkeitsmarker (mit Ausnahme von ».·«) ignoriert werden.
51 # Einträge mit speziellen Trennungen oder Doppeldeutigkeiten
52 # werden nicht verwendet.
54 # -x Ignoriere Optionen »-g«, »-G«, »-S«, »-u« sowie »-1« und gib die
55 # sprachspezifischen Felder unbearbeitet aus (inklusive
56 # Kommentare).
58 # -g Gib Wörter mit gewichteten Trennstellen aus. Optional kann ein
59 # ganzzahliges Argument angegeben werden: Wert 0 gibt alle
60 # gewichtete Trennstellen aus inklusive »-« (das ist der
61 # Standardwert), Wert 1 nur die Trennstellen mit der höchsten
62 # Wichtung (ohne »-«), Wert 2 die Trennstellen mit der höchsten
63 # und zweithöchsten Wichtung (ohne »-«), usw.
65 # Beachte, dass bei nahe beieinanderstehenden Trennstellen derzeit
66 # keine zusätzliche Wichtung vorgenommen wird. Beispielsweise ist
67 # in dem Wort
69 # ab<be<ru-fen
71 # die Trennung »abbe-rufen« schlecht, weil ganz nahe der optimalen
72 # Trennstelle (nach »ab«). Das Skript gibt trotzdem diese
73 # Trennstelle als zweitbeste aus.
75 # -u Verhindere die Ausgabe von Wörtern mit Markern für unerwünschte
76 # Trennungen (z.B. »An<=al-.pha=bet«). Wenn nicht gesetzt, werden
77 # als ungünstig markierte Trennstellen entfernt
78 # (z.B. »An<=alpha=bet«).
80 # -U Gib Wörter mit Nicht-ASCII-Zeichen auch in Umschrift aus (z.B.
81 # »loe-sen«, »Haen-de«). Ausgenommen davon sind Wörter mit »ß«,
82 # weil die entsprechenden Formen mit »ss« bereits in der Wortliste
83 # enthalten sind.
85 # -1 (Ziffer 1) Verhindere einbuchstabige Trennungen. Ist die Option
86 # gesetzt, wird die erste dieser Trennungen unterdrückt, falls
87 # beide Trennstellen gleichwertig sind (z.B. »eu-ro-päi-sche«
88 # statt »eu-ro-pä-i-sche«), anderenfalls bleibt die stärkere
89 # erhalten (z.B. »päd<ago-gisch« statt »pä-d<a-go-gisch«).
91 # Gesangstrennstellen sind von dieser Option nicht betroffen; es
92 # ist daher nicht sinnvoll, gleichzeitig »-G« zu verwenden.
94 # -S Entferne Schwankungsfälle (z.B. »Sta-tion« statt »Sta-ti-on«).
96 # -v Verhindere die Ausgabe von Versalformen, wo »ß« durch »ss«
97 # ersetzt ist.
99 # -l (Kleinbuchstabe L) Konvertiere die Ausgabe von UTF-8 nach
100 # latin-9.
103 # Options-Beispiele für den Eintrag »I·n<i-ti.a-ti.on«:
105 # -1 -S In-itia-tion
106 # -1 In-itia-ti-on
107 # (keine) In-iti-a-ti-on
108 # -G -S In-i-tia-tion
109 # -G In-i-ti-a-ti-on
112 # Wir verwenden »<<>>« statt »<>« aus Sicherheitsgründen.
113 require 5.22.0;
115 use strict;
116 use warnings;
117 use English '-no_match_vars';
118 use utf8; # String-Literals direkt als UTF-8.
119 use open qw(:std :utf8);
120 use Getopt::Long qw(:config bundling);
123 my ($opt_g, $opt_G,
124 $opt_l,
125 $opt_s, $opt_S,
126 $opt_t,
127 $opt_u, $opt_U,
128 $opt_v,
129 $opt_x,
130 $opt_1);
131 $opt_g = -1;
133 GetOptions("g:i" => \$opt_g, "G" => \$opt_G,
134 "l" => \$opt_l,
135 "s" => \$opt_s, "S" => \$opt_S,
136 "t" => \$opt_t,
137 "u" => \$opt_u, "U" => \$opt_U,
138 "v" => \$opt_v,
139 "x" => \$opt_x,
140 "1" => \$opt_1);
143 my $prog = $0;
144 $prog =~ s@.*/@@;
147 # Kodierung:
148 binmode(STDOUT, ":encoding(iso-8859-15)") if $opt_l;
151 # Einige Konstanten für reguläre Ausdrücke, um die Lesbarkeit zu
152 # erhöhen.
153 my $Marker = qr/[.·<>=-]/x;
154 my $Buchstabe = qr/(?: [^.·<>=-] | ch)/x;
155 my $Vokal = qr/[aeiouäëïöüy]/x;
156 # Konsonant: nicht Vokal, aber Buchstabe.
157 my $Konsonant = qr/(?! $Vokal ) $Buchstabe/x;
160 sub entferne_marker {
161 my $arg = shift;
162 $arg =~ s/$Marker//g;
163 return $arg;
166 # Wenn Option »-U« gesetzt ist, müssen wir erkennen können, ob Wörter
167 # in Umschrift in der Wortliste existieren. Wir benutzen dafür zwei
168 # Hashes.
169 my %wortliste;
170 my %wortliste_umschrift;
172 while (<<>>) {
173 # Gebe Kommentarzeilen direkt aus, falls verlangt.
174 if (/^ \s* \#/x) {
175 print if $opt_x;
176 next;
179 chop;
181 # Isoliere Kommentare.
182 s/(\# .*) $//x;
184 my $kommentar = $1 // "";
186 # Entferne Leerzeichen aller Art.
187 s/\s+//g;
189 my @feld = split(';');
190 next if $#feld < 1;
192 # reformiert: Felder 2, 4, 5, 7
193 # traditionell: Felder 2, 3, 5, 6
194 # traditionell Schweiz: Felder 2, 3, 5, 6, 8
196 # Beachte: Feld n hat Index n-1.
197 my $zeile = "";
198 $zeile = $feld[2] if defined $feld[2]
199 && $feld[2] ne "-3-" && ($opt_t || $opt_s);
200 $zeile = $feld[3] if defined $feld[3]
201 && $feld[3] ne "-4-" && !($opt_t || $opt_s);
202 if (!$zeile) {
203 # Wir nehmen Versalformen nur dann, wenn es keine normalen Formen
204 # (in Feld 2 oder 3) gibt.
205 $zeile = $feld[4] if defined $feld[4]
206 && $feld[4] ne "-5-" && !$opt_v;
207 $zeile = $feld[5] if defined $feld[5]
208 && $feld[5] ne "-6-" && ($opt_t || $opt_s) && !$opt_v;
209 $zeile = $feld[6] if defined $feld[6]
210 && $feld[6] ne "-7-" && !($opt_t || $opt_s) && !$opt_v;
213 $zeile = $feld[7] if defined $feld[7] && $opt_s;
215 if (!$zeile) {
216 $zeile = $feld[1];
219 next if $zeile eq "-2-";
221 if (!$opt_x) {
222 # Entferne spezielle Trennungen.
223 next if $opt_G and $zeile =~ /\{/;
224 $zeile =~ s|\{ (.*?) / .*? \}|$1|gx;
226 # Entferne Doppeldeutigkeiten.
227 next if $opt_G and $zeile =~ /\[/;
228 $zeile =~ s|\[ (.*?) / .*? \]|entferne_marker($1)|egx;
230 # Hier der Algorithmus, um die verbliebenen Markierungen in
231 # Trennstellen aufzulösen. Die Schritte sind in der gegebenen
232 # Reihenfolge abzuarbeiten.
234 # Dieses Skript implementiert ausschließlich den morphemischen
235 # Trennstil (siehe Punkt 1), unter weiterer Anwendung der Regeln 2
236 # bis 6.
238 # (1) Auflösung von Wahlmöglichkeiten zwischen morphemischem und
239 # syllabischem Trennstil (einer der beiden Stile muß gewählt
240 # werden). Ungünstigkeitsmarker und Gesangstrennstellen
241 # werden in diesem Schritt nicht berücksichtigt (wohl aber
242 # entfernt, wenn die entsprechende Trennstelle entfällt).
244 # (a) Die Bezeichnungen
246 # <x- und -x<
248 # sind Kurzschreibungen für
250 # {<x/x-} und {x</-x} (morphemisch/syllabisch) ,
252 # wobei »x« ein Konsonant oder »ch« ist. Diese Regel gilt
253 # nicht für die Suffixe »>x-« und »-x>«.
255 # Gleicherweise sind
257 # =x- und -x=
259 # Kurzschreibungen für
261 # {=x/x-} und {x=/-x} (morphemisch/syllabisch) .
263 # (b) Die Bezeichnungen
265 # <i- und -i<
267 # sind Kurzschreibungen für
269 # {<i·/i-} und {·i</-i} (morphemisch/syllabisch) ,
271 # wobei »i« ein Vokal ist (einschließlich »y«). Diese
272 # Regel gilt nicht für die Suffixe »>i-« und »-i>«. Die
273 # Zusammensetzungen »=i-« und »-i=« werden gegenwärtig
274 # nicht beachtet, da sie in der Wortliste nicht vorkommen
275 # (Beispiel: Ei-se-n=a-ch-er Motorenwerke).
277 # Beispielsweise bleibt die Markierung
279 # al-ge-bra>i-sche
281 # in diesem Schritt unverändert; wegen »>« gibt es keine
282 # Wahlmöglichkeit.
284 # (2) Behandle (angehängte) ».«-Marker, falls ungünstige
285 # Trennstellen unterdrückt werden sollen.
287 # (3) Entferne Flattervokale (also Einbuchstaben-Silben), falls
288 # verlangt. Beachte, daß »ch« wie ein Buchstabe behandelt
289 # wird und auch Schwankungsfälle (».«) berücksichtigt werden.
290 # Gesangstrennstellen dagegen werden ignoriert (aber
291 # gegebenenfalls entfernt).
293 # Die folgenden beiden Regeln beziehen sich auf die
294 # Trennstellen unmittelbar vor und nach dem Flattervokal.
296 # (a) Ist eine Trennstelle »stärker« als die andere, wird die
297 # stärkere Trennstelle genommen (z.B. ist »>« stärker als
298 # »-«, »-« stärker als ».«).
300 # (b) Sind die Trennstellen gleich stark, wird die rechte
301 # Trennstelle genommen.
303 # (4) Entferne Gesangstrennstellen (»·«), falls verlangt.
304 # Beachte, daß die Markierung für Gesangstrennstellen, ähnlich
305 # Ungünstigkeitsmarkern, auch zu anderen Markern treten kann
306 # (die dann ebenfalls entfernt werden).
308 # Die Markierung ».·« wird in jedem Fall entfernt.
310 # Falls Gesangstrennstellen berücksichtigt werden sollen und
311 # Situationen wie »·x<« auftreten (wobei »x« ein Konsonant
312 # oder »ch« ist), wird die »stärkere« Trennstelle genommen.
314 # (5) Entferne restliche Schwankungsfälle, falls verlangt.
316 # (6) Alle verbliebenen Markierungen werden zu »-« aufgelöst.
319 # Beispiele:
320 # Re<s-tau-rant
321 # Re<stau-rant (1a, morphemisch)
322 # Re-stau-rant (6)
324 # Re<s-tau-rant
325 # Res-tau-rant (1a, syllabisch)
327 # Mon-t=re-al
328 # Mont=re-al (1a, morphemisch)
329 # Mont-re-al (6)
331 # Mon-t=re-al
332 # Mon-tre-al (1a, syllabisch)
334 # Ge-r<i.a-trie
335 # Ger<i.a-trie (1a, morphemisch)
336 # Ger<ia-trie (3)
337 # Ger-ia-trie (6)
339 # Ge-r<i.a-trie
340 # Ge-ri.a-trie (1a, syllabisch)
341 # Ge-ria-trie (3)
343 # Ärz-te=i·n<.i-ti.a-ti-ve
344 # Ärz-te=i·n<.i·ti.a-ti-ve (1b, morphemisch)
345 # Ärz-te=i·ni·ti.a-ti-ve (2)
346 # Ärz-te=i·ni·tia-ti-ve (3a)
347 # Ärz-te=initia-ti-ve (4)
348 # Ärz-te-initia-ti-ve (6)
350 # Ärz-te=i·n<.i-ti.a-ti-ve
351 # Ärz-te=i·ni-ti.a-ti-ve (1b, syllabisch)
352 # Ärz-te=i·ni-tia-ti-ve (3a)
353 # Ärz-te=ini-tia-ti-ve (4)
354 # Ärz-te-ini-tia-ti-ve (6)
356 # Di-a<s-po-ra
357 # Di·a<s-po-ra (1b, morphemisch)
358 # Di·a<spo-ra (1a)
359 # Dia<spo-ra (4)
360 # Dia-spo-ra (6)
362 # Di-a<s-po-ra
363 # Di-as-po-ra (1b, syllabisch)
365 # Kaf-ka=ken-.ner
366 # Kaf-ka=kenner (2)
367 # Kaf-ka-kenner (6)
369 # al-ge-bra>i-sche
370 # al-ge-bra>ische (3a)
371 # al-ge-bra-ische (6)
373 # Ru-i-ne
374 # Rui-ne (3b)
376 # A<·s-phalt
377 # A<·sphalt (1a, morphemisch)
378 # Asphalt (4)
380 # A<·s-phalt
381 # As-phalt (1a, syllabisch)
383 # ge-ni.al
384 # ge-nial (5)
386 # Ak-ti.·e
387 # Ak-tie (4)
389 # A·b<i-tur
390 # A·b<i·tur (1b, morphemisch)
391 # Ab<i·tur (4, mit Gesangstrennstellen)
392 # Ab-i-tur (6)
394 # A·b<i-tur
395 # A·bi-tur (1b, syllabisch)
396 # A-bi-tur (6, mit Gesangstrennstellen)
398 # Schritt 1a: »<x-« wird zu »<x«.
399 $zeile =~ s/[<=] [.·]* $Konsonant \K - \.*//gx;
400 # »-x<« wird zu »x<«.
401 $zeile =~ s/- \.* (?= $Konsonant \.* [<=] )//gx;
403 # Schritt 1b: »<i-« wird zu »<i·«.
404 $zeile =~ s/< \.* $Vokal \K -/·/gx;
405 # »-i<« wird zu »·i<«.
406 $zeile =~ s/- (?= \.* $Vokal < )/·/gx;
408 # Ausgabe von Wörtern mit unerwünschten Trennungen?
409 next if $opt_u and $zeile =~ /\./;
411 # Schritt 2: »a<.b« wird zu »ab«.
413 # Beachte, daß die Kombination »·.« zwar nicht in der Wortliste
414 # vorkommt, sehr wohl jedoch als Ergebnis von Schritt 1b.
415 $zeile =~ s/[·<>=-]+ \.+//gx if !$opt_G;
417 if ($opt_1) {
418 # Schritt 3a: »a-i>c« wird zu »ai>c«.
419 $zeile =~ s/[-.]+ (?= $Vokal [<>=] )//gx;
420 # »a.i-c« wird zu »ai-c«.
421 $zeile =~ s/\.+ (?= $Vokal - )//gx;
422 # »a<i-c« wird zu »a<ic«.
423 $zeile =~ s/[<>=] [·<>=]* $Vokal \K [-.]+//gx;
424 # »a-i.c« wird zu »a-ic«.
425 $zeile =~ s/- $Vokal \K \.+//gx;
427 # Schritt 3b: »a-i-c« wird zu »ai-c«.
428 $zeile =~ s/- (?= $Vokal - )//gx;
431 # Schritt 4:
432 $zeile =~ s/\.·//g;
433 if ($opt_G) {
434 # »a·x<c« wird zu »ax<c«.
435 $zeile =~ s/(?<! <) ·+ (?= $Konsonant < )//gx;
437 else {
438 # »a<·b« wird zu »ab«.
439 $zeile =~ s/$Buchstabe \K $Marker* ·+//gx;
442 # Schritt 5:
443 if ($opt_S) {
444 # »a.b« wird zu »ab«.
445 $zeile =~ s/\.//gx;
447 else {
448 # »a.b« wird zu »a-b«.
449 $zeile =~ s/\./-/gx;
452 if ($opt_g > 0) {
453 # Berechne Wichtungen. Wir verwenden folgende Werte:
455 # -2 Wortteil
456 # -1 -
457 # 0 --
458 # 1 <, >
459 # 2 =
460 # 3 ==, <=, =>
461 # 4 ===, <==, ==>
462 # ..
464 # Bei mehrfachem Auftreten von »<« hat das am meisten links
465 # stehende den höchsten Rang. Bei mehrfachem Auftreten von »>«
466 # hat das am meisten rechts stehende den höchsten Rang.
467 # Beispiel:
469 # Mit<ver<ant-wort>lich>keit
470 # ^ ^
472 # Das bezieht sich auch auf Ketten mit »=>« u.ä:
474 # Ei-gen=wirt>schaft=>lich>keit
477 my $g;
478 my $marker;
479 my ($rang, $rang_vorher);
480 my ($wichtung, $wichtung_vorher);
482 # Wir zerlegen mit `split' unter Beibehaltung der Begrenzer.
483 my @zerlegung = split /([<>=-]+)/, $zeile;
485 # Wir speichern Wichtung und Rang als Felder.
486 my @wichtungen = (-2) x ($#zerlegung + 1);
487 my @ränge = (0) x ($#zerlegung + 1);
489 # Erster Durchgang: Ermittle Wichtungswerte.
491 # Wir starten bei erstem Marker (mit Index 1).
492 foreach my $i (1 .. ($#zerlegung - 1)) {
493 # Ignoriere Nicht-Marker.
494 next if not $i % 2;
496 $marker = $zerlegung[$i];
498 if ($marker =~ /^-$/) {
499 $wichtung = -1;
501 elsif ($marker =~ /^--$/) {
502 $wichtung = 0;
504 elsif ($marker =~ /^[<>]$/) {
505 $wichtung = 1;
507 elsif ($marker =~ /^=$/) {
508 $wichtung = 2;
510 elsif ($marker =~ /( ==*>? | <?=*= )/x) {
511 $wichtung = length($1) + 1;
513 else {
514 warn "Zeile $INPUT_LINE_NUMBER:"
515 . " unbekannter Marker »$marker« behandelt als »-«\n";
516 $wichtung = -1;
519 $wichtungen[$i] = $wichtung;
522 # Zweiter Durchgang: Adjustiere Wichtung von »<« und »>«.
524 # Behandle »<« von rechts nach links gehend.
525 $wichtung_vorher = -2;
526 foreach my $i (reverse(1 .. ($#zerlegung - 1))) {
527 # Ignoriere Nicht-Marker.
528 next if not $i % 2;
530 if (index ($zerlegung[$i], "<") >= 0) {
531 # Hat der rechte Marker in einer Kette von »<« eine höhere
532 # Wichtung, wird diese übernommen.
533 $wichtung = $wichtungen[$i];
535 if ($wichtung_vorher >= $wichtung) {
536 $wichtungen[$i] = $wichtung_vorher;
538 else {
539 $wichtung_vorher = $wichtung;
542 # »-«-Marker zwischen zwei »<« ändert nicht deren Wichtung.
543 elsif ($zerlegung[$i] ne "-") {
544 $wichtung_vorher = -2;
548 # Behandle »>« von links nach rechts gehend.
549 $wichtung_vorher = -2;
550 foreach my $i (1 .. ($#zerlegung - 1)) {
551 # Ignoriere Nicht-Marker.
552 next if not $i % 2;
554 if (index ($zerlegung[$i], ">") >= 0) {
555 # Hat der linke Marker in einer Kette von »>« eine höhere
556 # Wichtung, wird diese übernommen.
557 $wichtung = $wichtungen[$i];
559 if ($wichtung_vorher >= $wichtung) {
560 $wichtungen[$i] = $wichtung_vorher;
562 else {
563 $wichtung_vorher = $wichtung;
566 # »-«-Marker zwischen zwei »>« ändert nicht deren Wichtung.
567 elsif ($zerlegung[$i] ne "-") {
568 $wichtung_vorher = -2;
572 # Dritter Durchgang: Ermittle Rang von »<« und »>«.
574 # Behandle »<« von links nach rechts gehend.
575 $rang = 0;
576 foreach my $i (1 .. ($#zerlegung - 1)) {
577 # Ignoriere Nicht-Marker.
578 next if not $i % 2;
580 if (index ($zerlegung[$i], "<") >= 0) {
581 $ränge[$i] = $rang--;
583 # »-«-Marker zwischen zwei »<« ändert nicht den Rang.
584 elsif ($zerlegung[$i] ne "-") {
585 $rang = 0;
589 # Behandle »>« von rechts nach links gehend.
590 $rang = 0;
591 foreach my $i (reverse(1 .. ($#zerlegung - 1))) {
592 # Ignoriere Nicht-Marker.
593 next if not $i % 2;
595 if (index ($zerlegung[$i], ">") >= 0) {
596 $ränge[$i] = $rang--;
598 # »-«-Marker zwischen zwei »>« ändert nicht den Rang.
599 elsif ($zerlegung[$i] ne "-") {
600 $rang = 0;
604 # Sortiere Indexfeld für Marker mit absteigender Wichtung.
605 my @wichtungsindices =
606 sort {
607 # Benutze Rang für Sekundärsortierung.
608 if ($wichtungen[$a] == $wichtungen[$b]) {
609 -($ränge[$a] <=> $ränge[$b]);
611 else {
612 -($wichtungen[$a] <=> $wichtungen[$b]);
614 } (0 .. $#zerlegung);
616 # Entferne Trennstellen unter Berücksichtigung des Arguments von
617 # »-g«.
618 $g = 0;
619 $wichtung_vorher = -2;
620 $rang_vorher = 0;
622 foreach my $i (@wichtungsindices) {
623 # Alle Wortteile haben einen geraden Index und sind stets am
624 # Schluß von @wichtungsindices.
625 last if not $i % 2;
627 $wichtung = $wichtungen[$i];
628 $rang = $ränge[$i];
630 if ($wichtung_vorher == $wichtung) {
631 $g++ if $rang_vorher != $rang;
633 else {
634 $g++;
637 $wichtung_vorher = $wichtung;
638 $rang_vorher = $rang;
640 # Entferne Trennung mit zu geringer Wichtung.
641 $zerlegung[$i] = "" if $g > $opt_g || $wichtung < 0;
644 $zeile = join '', @zerlegung;
646 elsif ($opt_g < 0) {
647 # Schritt 6.
648 $zeile =~ s/$Marker+/-/g;
652 print "$zeile";
653 print " " . $kommentar if $kommentar && $opt_x;
654 print "\n";
656 # Der Schlüssel im Hash ist das ungetrennte Wort, konvertiert zu
657 # Kleinbuchstaben; Wert wird keiner gebraucht.
658 $wortliste{lc($feld[0])} = ();
660 if ($opt_U) {
661 my $orig_zeile = $zeile;
663 $zeile =~ tr[ÀàÁáÂâÃãÇçÈèÉéÊêËëÌìÍíÎîÏïÑñÒòÓóÔôÕõŠšÙùÚúÛûÝýŸÿŽž]
664 [AaAaAaAaCcEeEeEeEeIiIiIiIiNnOoOoOoOoSsUuUuUuYyYyZz];
666 $zeile =~ s/Ä/Ae/g;
667 $zeile =~ s/ä/ae/g;
668 $zeile =~ s/Å/Aa/g;
669 $zeile =~ s/å/aa/g;
670 $zeile =~ s/Æ/Ae/g;
671 $zeile =~ s/æ/Ae/g;
673 $zeile =~ s/Ö/Oe/g;
674 $zeile =~ s/ö/oe/g;
675 $zeile =~ s/Ø/Oe/g;
676 $zeile =~ s/ø/oe/g;
677 $zeile =~ s/Œ/Oe/g;
678 $zeile =~ s/œ/oe/g;
680 $zeile =~ s/Ü/Ue/g;
681 $zeile =~ s/ü/ue/g;
683 $wortliste_umschrift{lc($feld[0])} = $zeile if $orig_zeile ne $zeile;
687 if ($opt_U) {
688 # Wir geben nur Wörter aus, die nicht bereits in der originalen
689 # Wortliste existieren.
690 foreach my $wort (sort(keys %wortliste_umschrift)) {
691 my $umschrift = $wortliste_umschrift{$wort};
692 my $test = lc(entferne_marker($umschrift));
694 print "$umschrift\n" if not exists ($wortliste{$test});
698 # eof