Font
[thread]9140[/thread]

Ein string auf ein Musterüberprüfen ! (page 3)



<< |< 1 2 3 4 5 6 >| >> 52 entries, 6 pages
mr-sansibar
 2007-07-06 12:01
#78040 #78040
User since
2006-04-13
90 articles
BenutzerIn
[default_avatar]
Vielen Dank Renne !
Habe zuvor noch nie Perl programmiert aber macht mir spass hier in diesem Forum von Euch gute Ratschläge zu bekommen.
Sicherlich als ein erfahrener Perl programmierer hast du Kritik an meinem Perl Programm, das kannst du ruhig machen
:)
renee
 2007-07-06 12:25
#78041 #78041
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Na gut ;)

Code: (dl )
1
2
3
4
5
6
7
8
9
            $line= substr($_,10,length($_));
@array = split(/ /, $line);
$line='';


foreach my $idx (0 .. 5) {
$array[$idx].="|"
}
print "$counter|",@array,"\n";


Das ist zu umständlich gedacht...

Wenn man sich den Ausgangsstring anschaut und das was am Ende rauskommen soll, fällt eins auf: Dort wo Leerzeichen waren, sind auf einmal Pipes. Klar, kann man mit split arbeiten. Dann sollte man die Elemente aber mit der Pipe verbinden. Dafür gibt es join. Also könnte man es rein theoretisch so machen:
Code (perl): (dl )
1
2
3
4
my $string = "Dies ist ein Test";
my @array = split / /, $string;
my $new_string = join "|", @array;
print $new_string;


Aber warum umständlich wenn es auch einfach geht.

tr/// ersetzt einzelne Zeichen durch ein anderes Zeichen. tr/// und s/// sind in perlop beschrieben.

Also geht es einfach mit
Code (perl): (dl )
$string =~ tr/ /|/
...

Aber keine Angst, solche Sachen kommen mit der Erfahrung.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-07-06 12:29
#78042 #78042
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
           foreach my $idx (0 .. 5) {
$array[$idx].="|"
}


In Perl gibt es die Möglichkeit, direkt über die Elemente zu iterieren. Dann muss man nicht über den Index des Arrays arbeiten.

Code (perl): (dl )
1
2
3
           foreach my $elem ( @array ) {
           $elem .= "|";
          }


Wenn Du doch mal mit dem Index arbeiten musst, dann musst Du den Bereich nicht so hart reinschreiben wie Du es gemacht hast (0 .. 5). Man kann vielmehr die Länge des Arrays "berechnen".

Code (perl): (dl )
1
2
3
           foreach my $idx (0 .. scalar(@array)-1 ) {
           $array[$idx].="|"
          }


Mit scalar bekommt man die Anzahl der Elemente, die in einem Array sind. Da der Index bei 0 anfängt, muss man noch das -1 machen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2007-07-06 12:32
#78043 #78043
User since
2003-08-04
12204 articles
Admin1
[Homepage]
user image
[quote=renee,06.07.2007, 10:29]
Code (perl): (dl )
1
2
3
           foreach my $idx (0 .. scalar(@array)-1 ) {
           $array[$idx].="|"
          }
[/quote]
dann doch eher
Code (perl): (dl )
1
2
3
foreach my $idx (0 .. $#array ) {
    $array[$idx] .= "|"
}
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2007-07-06 12:35
#78044 #78044
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
jepp, kann man auch machen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mr-sansibar
 2007-07-06 13:02
#78045 #78045
User since
2006-04-13
90 articles
BenutzerIn
[default_avatar]
ich finde ein Array in diesem fall besser, weil ich auch noch überprüfen will ob im Index 2 ein wert steht, wenn kein wert steht den die komplette eingelesene zeile verwerfen !!!
was meint ihr dazu, hierzu ist Array besser ?\n\n

<!--EDIT|mr-sansibar|1183712755-->
renee
 2007-07-06 13:13
#78046 #78046
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
ja, da kann man das gut mit dem Array machen. Ich würde das dann so machen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
    if( $line =~ /^Context/ ){
        $line =~ s/^Context:\s+//;
        my @array = split /\s/, $line;
        if( $array and $array[2] ne '' ){
            # mach was wenn $array[2] nicht leer ist...
        }
        $line = join "|", @array;
        print $context $line;
    }
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mr-sansibar
 2007-07-06 20:05
#78047 #78047
User since
2006-04-13
90 articles
BenutzerIn
[default_avatar]
habe mein skript verbesser mithilfe eurer tips. aber leider liefert mein skript weiterhin eine fehlermedlung :
Use of uninitialized value in string ne at H:\masterarbeit\log_files\logfile_parser_forum.pl line 48, <$in> line 4842

diese fehlermeldung kommt dann wenn ich eine sehr große dateien parsen will.
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
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use strict;
use warnings;
use Time::HiRes qw(gettimeofday);

my @logfilelist =glob("*.log");
my @datfilelist = glob("*.dat");

#my $file = '/dntrading-webapp_snorfu2_2007-05-24_05-43-11_1.log.20070526_050348.log';
my $context_file = "frontend_context.dat";
my $message_file = "frontend_message.dat";

my @array;
my $counter=0;
my $MessageFound=0;
my $line;
my $tmp_line;

my $t0 = gettimeofday();

foreach my $datFile(@datfilelist) {
unlink($datFile);
print "$datFile gelöscht \n";
}

open my $context, '>>', $context_file or die $!;
print $context "CONTEXT_ID|CONTEXT_DATE|CONTEXT_TIME|SESSION_ID|LID-USER|LID-KUNDE|ORDERCHANNEL|SOURCE\n";

open my $message, '>>', $message_file or die $!;
print $message "MESSAGE_ID|MESSAGE\n";

foreach my $logFile(@logfilelist) {
open my $in , '<', $logFile or die $!;
print "Umstrukturieren $logFile \n";
while( my $line = <$in> ){
if( $line =~ /^Context/ ){
$line=~ s/^Context:\s+//;
@array = split /\s/, $line;
$line = join "|", @array;
if( $array[2] ne '' ){

$counter++;

print $context "$counter|$line\n";
}

}
if( $line =~ /^Message:/ || $MessageFound){
if($array[2] ne '')
{

$MessageFound=1;

if($line =~ /^\n/)

{

chomp($line);

$line =~ s/\s/ /g;

print $message "$counter|$tmp_line\n";

$tmp_line = '';

$MessageFound=0;

}

else

{ chomp($line);

$line=~ s/\s/ /g;

$tmp_line .= $line;

}
}
}

}
close $in;
}

close $message;
close $context;


komm einfach nicht mehr weiter !!!
mit kleineren files klappt es wunderbar !!!\n\n

<!--EDIT|mr-sansibar|1183738009-->
renee
 2007-07-06 20:11
#78048 #78048
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Ich hatte in meinem anderen Posting das auch etwas anders aufgeschrieben:
Code (perl): (dl )
1
2
3
        if( $array and $array[2] ne '' ){
            # mach was wenn $array[2] nicht leer ist...
        }


Du solltest das $array and drinlassen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
mr-sansibar
 2007-07-06 20:30
#78049 #78049
User since
2006-04-13
90 articles
BenutzerIn
[default_avatar]
wenn ich $array
in die if anweisung bekomme fehlermeldung:
Global symbol "$array" requires explicit package name at H:\xxx\log_files\logfile_parser_forum.pl line 41.
<< |< 1 2 3 4 5 6 >| >> 52 entries, 6 pages



View all threads created 2007-06-29 17:48.