Leser: 24
1
2
3
4
5
6
7
8
9
10
test 1 von Computer 4711
MHz = 500
RAM = 256
Screen = 17 Zoll
[end.message]
test 2 von Computer 0815
MHz = 1500
RAM = 512
Screen = 21 Zoll
[end.message]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (defined(my $line = $fh->getline())) {
chomp($line);
my $end_line = "[end.message]";
#if ($line =~ /$String/ && $line =~ /$end_line/) {
if ($line =~ m/$String|$end_line/) {
my $Zeile = $fh->input_line_number;
my $read = $fh->read(my $buffer, 32*1024);
open(LOG, ">>result.txt") or die $!;
print LOG "$line $end_line,\n";
close LOG;
} # if
} # while
$fh->close();
}
}
}
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
#!/usr/bin/perl use strict; use warnings; my $output_file = '/dev/null'; my $search = 'test 1'; my $end_of_block = '[end.message]'; open my $outfh, '>>', $output_file or die "$output_file: open failed: $!\n"; while ( my $line = <DATA> ) { if ( index( $line, $search, 0 ) >= 0 .. index( $line, $end_of_block, 0 ) >= 0 ) { print $outfh $line or die "$output_file: print failed: $!\n"; } } close $output_file or die "$output_file: close failed: $!\n"; __DATA__ test 1 von Computer 4711 MHz = 500 RAM = 256 Screen = 17 Zoll [end.message] test 2 von Computer 0815 MHz = 1500 RAM = 512 Screen = 21 Zoll [end.message]
1 2 3 4 5 6 7 8 9 10 11
#!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); my $string = "[end.message]"; cmpthese(10000000, { INDEX => sub { index( $string, 'message', 0) >=0 }, REGEX => sub { $string =~ /message/ }, });
1
2
3
4
nepos@blackbox:/tmp$ perl benchmark.pl
Rate REGEX INDEX
REGEX 4545455/s -- -25%
INDEX 6024096/s 33% --
2009-05-08T09:34:35 neposDa wirst du sehen, dass index() immer schneller ist, als die Regex-Engine, wenn du einen fixen String benutzt:
2009-05-08T09:59:41 DubuWenn der Test in der Art
if (index ($string, $substring) == 0) { ...
lautet, dann müsste perl ja nur den Anfang von $string prüfen, ob dieser mit $substring übereinstimmt, und nicht den ganzen $string. Macht es das nicht?
my ($x, $y) = split ...;
2009-05-08T10:18:06 DubuSorry, hatte nicht gesehen, dass du schon geantwortet hast.
Ergebnis s.o.: Verankerte Regexp ist den Faktor 10000 schneller als "index() == 0" bei einem 10MB-String. Es wird also nicht optimiert.
2009-05-08T10:02:42 pqCode (perl): (dl )my ($x, $y) = split ...;
dann splittet perl nur maximal 2 mal, da eh nur 2 variablen gebraucht werden. aber ich glaube nicht, dass das == 0 so erkannt werden kann,
2009-07-01T16:24:10 pqwenn ich zwei variablen erwarte und der string so aussieht: foo=bar=baz=boo, und zweimal gesplittet wird, also hinter dem foo und hinter dem bar, dann kommt als ergebnis
foo, bar, baz=boo
reicht doch aus, ich möchte zwei variablen, und die dritte lass ich wegfallen.
mit n+1 meinst du vielleicht eher die anzahl der gesplitteten elemente?
2009-07-01T16:45:24 pqinsofern ist meine aussage also doch richtig (von der terminologie her ist "gesplittet" eindeutig nicht gleich mit "anzahl der gesplitteten elemente).
Quoteeinfach mal nachdenken das nächste mal, bevor du mir was falsches unterstellst.
2009-07-01T16:50:50 sid burnIch werde mich gleich auspeitschen gehen, damit mir nie mehr ein Fehler passieren wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; my $file = 'log.dat'; $/ = "[end.message]\n"; my $search = 'test 1'; open my $fh, '<', $file or die "cannot open $file: $!"; while (<$fh>) { next unless /^\Q$search\E/; chomp; print; } close $fh;
1 2 3 4 5 6 7 8 9 10
use Tie::File; my $file = 'test.txt'; tie my @lines, 'Tie::File', $file or die $!; for my $i ( 0 .. $#lines ) { if( $lines[$i] =~ /Suchbegriff/ ) { print $lines[ $i-23 ]; } } untie @lines;
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
use strict;
use warnings;
use Tie::File;
use Archive::Zip;
use Archive::Zip::MemberRead;
use File::Glob ':glob';
my $Zip_File = 'ON_35110000_11485_AP06_UTC_29.06.2009_18.25.zip';
my $String = 'SYSTEM NOT AVAILABLE';
my $zip = new Archive::Zip($Zip_File);
my @file2 = $zip->membersMatching( '.*' );
for my $file2 (@file2){
my $fh = new Archive::Zip::MemberRead($zip, $file2);
my $fh2 = $file2->fileName();
print $fh2,"\n";
while (defined(my $line = $fh->getline())) {
chomp($line);
tie my @line, 'Tie::File', $fh2 or die $!;
for my $i ( 0 .. $#line ) {
if ($line[$i] =~ /$String/) {
my $Zeile = $fh->input_line_number;
my $read = $fh->read(my $buffer, 32*1024);
open(LOG, ">>result.txt") or die $!;
print LOG $line[ $i-23 ];
close LOG;
untie @line;
}
}
$fh->close();
}
}
2009-05-08T09:50:38 DubuIch würde ja grundsätzlich bevorzugen, abschnittweise einzulesen. Finde ich übersichtlicher in Perl.
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
my $zip = new Archive::Zip($Zip_File);
my @file2 = $zip->membersMatching( '.*' );
for my $file2 (@file2){
my $fh = new Archive::Zip::MemberRead($zip, $file2);
my $fh2 = $file2->fileName();
print $fh2,"\n";
my @suche = "";
my $pointer = '1';
while (defined(my $line = $fh->getline())) {
chomp($line);
$suche [$pointer] = $line;
if ( $line =~ /$String/ ) {
my $Zeile = $fh->input_line_number;
my $read = $fh->read(my $buffer, 32*1024);
open(LOG, ">>result.txt") or die $!;
my $string_before = $pointer+1;
if ( $string_before == '25' ) {
$string_before = '1';
}
print LOG "\nFound in Line $Zeile Search String\n$line\n$suche[$string_before] Log File $fh\n";
close LOG;
} # if
$pointer++;
if ( $pointer == '25' ) {
$pointer =1;
}
} # while
$fh->close();
}