Thread Text zwischen def. Tags in Blöcke mit def. Länge aufteilen. (11 answers)
Opened by leo11 at 2008-12-21 14:05

leo11
 2008-12-21 14:05
#117378 #117378
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hallo liebe Perl-Fans.

Ich habe ein Programm geschrieben, dass den Text:

BEFORE> <Text>ZeileA
ZeileB
ZeileC</Text>After
<Text>Zeile1
Zeile2 Zeil3</Text>After2

in folgenden umwandelt:

BEFORE>
<Text>Zeil</Text>
<Text>eA Z</Text>
<Text>eile</Text>
<Text>B Ze</Text>
<Text>ileC</Text>
After
<Text>Zeil</Text>
<Text>e1 </Text>
<Text>Zeil</Text>
<Text>e2 Z</Text>
<Text>eil3</Text>
After2

Das Programm sieht so aus:
Code (perl): (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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/perl -n

BEGIN {
    use strict;
    use warnings;
    #use Data::Dumper;

    my $filename = $ENV{FILENAME};
    unless (defined($filename)) {die "No filename in environment (filename)\n";}

    @ARGV = $filename;

    my $flag = '0';
    my @lines;
    my $whole_match;
    my @part_before_match;
    my @part_after_match;
    my @number_of_matches;
}

if ( $_ =~ m/<Text>/ ) {
    $flag = '1';
}

if ( $flag == '1' ) {
    $_ =~ s/\r\n//;
    $_ =~ s/\n//;
    $whole_match = $whole_match . $_ . " ";
    if ( $_ =~ m/<\/Text>/ ) {
        $flag = '0';
        @number_of_matches = $whole_match =~ m/(Text>)/g;
        if ( scalar(@number_of_matches) > 2 ) { 
            die "More then one Text in one line.";
        }
        @part_before_match = $whole_match =~ /(.*)(?=<Text>)/;
        @part_before_match->[0] =~ s/^ *$//g;
        @part_after_match = $whole_match =~ /(?<=<\/Text>)(.*)/;
        @part_after_match->[0] =~ s/^ *$//g;
        $whole_match =~ s/[^<]*<Text>//;
        $whole_match =~ s/<\/Text>.*//s;
        @lines = $whole_match =~ m/(.{1,4})/g;
        if ( defined @part_before_match &&  @part_before_match->[0] ne "") {print "@part_before_match\n";}
        #print Dumper @part_before_match;
        foreach my $line (@lines) {
            print "    <Text>$line</Text>\n";
        }
        if ( defined  @part_after_match && @part_after_match->[0] ne "") {print "@part_after_match\n";}
        #print Dumper @part_after_match;
        undef @lines;
        undef $whole_match;
        undef @part_before_match;
        undef @part_after_match;
        undef @number_of_matches;
    }
}
else {
    print;
}


a.)So richtig überzeugt bin ich von meiner Umsetzung nicht. Was haltet ihr davon?

b.)Für die Dateien die ich habe macht es seinen Dienst. Trotzdem würd ich gern den Fall abfangen, dass es auch geht wenn ich Zeilen habe in denen mehr als einmal die Kombination <Text>....</Text> vorkommt.

View full thread Text zwischen def. Tags in Blöcke mit def. Länge aufteilen.