Thread Probleme mit anonymen subs (13 answers)
Opened by Ronnie at 2005-03-10 09:25

Ronnie
 2005-03-10 09:25
#52490 #52490
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Auf der DaLUG-Mailingsliste hat jemand nach einer Möglichkeit gesucht in einer Logdatei Ersetzungen anhand einer Zuordnungsliste in einer weiteren Datei durchzuführen. Eine mögliche Lösung ist es eine LookUpTable zu bauen und dann Zeile für Zeile die Ersetzungen durch zuführen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl

use strict;
use warnings;

my %lookup;

for (<DATA>) {
chomp;
my ($k, $v) = split(/ -- /);
$lookup{$k} = $v;
}

while(<>) {
s/^(\w+)\b/$lookup{$1} || $1/e;
print;
}

_ _DATA_ _
uidf2920 -- Schulz
uid60124 -- Maier
uidg1626 -- Muster
uidg1067 -- Mueller

Dies war mein Lösungsvorschlag. Jemand anderes schlug eine Lösung mit sed vor, die in zwei Schritten arbeitet. Erst wird die Datei mit den Zuordnungen verarbeitet (das was ich oben in _ _DATA_ _ gestopft habe) und eine weitere sed-Datei erzeugt:
Code: (dl )
uidf2920 -- Schulz  wird zu s/uidf2920/Schulz/

Diese wird dann über die Logdatei laufen lassen und erzeugt das gewünschte Ergebniss.

Es gab noch einige andere interessante Lössungsvorschläge, aber zurück zu Perl und sed. Ich fand die Idee ganz interessant und dachte mir man könnte das auch in Perl mit einem Array voller anonymer Funktionen machen, sozusagen der Lambda-Weg zur Lösung. Das die Lösung mit der LookUpTable deutlich effizienter sein dürfte ist mir bewusst, aber mir ging es eher um die Umsetzung der Idee:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl
#
# lambda-style!
#


use strict;
use warnings;
use Data::Dumper;

my @substitutes;
for (<DATA>) {
chomp;
my ($k, $v) = split(/ -- /);
push @substitutes, sub {s/^$k/$v/;};
}

while(<>) {
for my $repl (@substitutes) { $_ =~ $repl }
print;
}

_ _DATA_ _
uidf2920 -- Bla BlaBla
uid60124 -- Maier
uidg1626 -- Muster
uidg1067 -- Mueller

Leider funktioniert mein Skript nicht wie es sollte - es führt keine Ersetzungen durch. Irgendwo muss ich etwas elementares übersehen haben, vieleicht fällt euch ja was auf?!

EDIT: Das leidige _ _DATA_ _ -Problem.\n\n

<!--EDIT|Ronnie|1110439628-->

View full thread Probleme mit anonymen subs