[gelöst] Perl -Suchen und Ersetzen, Wert aus Hash nehmen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
McAldo
Moderator
Beiträge: 2069
Registriert: 26.11.2003 11:43:36
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Terra / Sol-System / Milchstraße

[gelöst] Perl -Suchen und Ersetzen, Wert aus Hash nehmen

Beitrag von McAldo » 18.10.2006 13:11:28

Hallo

Ich muss in einem Text vor bestimmten Wörtern ein Zeichen einfügen. Die Wörter werden in einer Konfigurationsdatei gespeichert, auf jeder Zeile eins.

Diese Datei wird bei Bedarf eingelesen und die Wörter (es sind mehrere) werden in einem Hash gespeichert.

Code: Alles auswählen

	$hash{$_} = 1;
Das klappt auch super und man kann auf die Werte mit

Code: Alles auswählen

keys %hash
zugreifen.

Nun möchte ich aber in der Textdatei nach diesen Wörtern suchen und dann mit einem weiteren Zeichen davor (gespeichert in $ZEICHEN) ersetzen. Meine Überlegungen dazu sehen so aus:

Code: Alles auswählen

 $TEXT =~ s/ (`keys %hash`)/ $ZEICHEN$1/g;
Funktioniert aber nicht. :(

McAldo
Zuletzt geändert von McAldo am 18.10.2006 14:20:55, insgesamt 1-mal geändert.
Achte auf deine Gedanken, denn sie werden Worte.
Achte auf deine Worte, denn sie werden Handlungen.
Achte auf deine Handlungen, denn sie werden Gewohnheiten.
Achte auf deine Gewohnheiten, denn sie werden dein Charakter.
Achte auf deinen Charakter, denn er wird dein Schicksal.
(Talmud)

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 18.10.2006 13:44:51

Wie sollte

Code: Alles auswählen

$TEXT =~ s/ (`keys %hash`)/ $ZEICHEN$1/g;
denn auch klappen?

Code: Alles auswählen

keys %hash
liefert einen Array mit allen Keys des Hashes. Deine Backticks fuehren da aber was in der Shell aus, sicher nicht das, was du willst.
So ganz kapiere ich noch nicht, was du da machen willst.
Wenn du nach den Woertern suchen willst, dann solltest du das eventuell so machen:

Code: Alles auswählen

my $pattern = '(' . join('|', keys %hash) . ')';
$TEXT =~ s/$pattern/$ZEICHEN$1/g;
Zur Erklaerung:

Code: Alles auswählen

join('|', keys %hash)
baut aus deinen Hashkeys, also den Woertern, nach denen du suchen willst so einen String: wort1|wort2|wort3|.
Mit den Klammern drum rum wird daraus ein Pattern, das auf die einzelnen Woerter machted.

Ach ja, falls du das noch nicht tust, benutzt use strict; und use warnings;.
Das merzt einige Fehler von Anfang an aus und hilft dir, sauberen Code zu schreiben.

Benutzeravatar
McAldo
Moderator
Beiträge: 2069
Registriert: 26.11.2003 11:43:36
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Terra / Sol-System / Milchstraße

Beitrag von McAldo » 18.10.2006 14:20:38

Danke, genau das habe ich gesucht. *freu* Nun komm ich weiter.


McAldo
Achte auf deine Gedanken, denn sie werden Worte.
Achte auf deine Worte, denn sie werden Handlungen.
Achte auf deine Handlungen, denn sie werden Gewohnheiten.
Achte auf deine Gewohnheiten, denn sie werden dein Charakter.
Achte auf deinen Charakter, denn er wird dein Schicksal.
(Talmud)

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 18.10.2006 14:43:50

Freut mich, dass ich dir helfen konnte :)

Antworten