Schrift
[thread]6926[/thread]

Zeitbegrenzung für reguläre Ausdrücke (Seite 2)



<< |< 1 2 3 4 5 >| >> 41 Einträge, 5 Seiten
ptk
 2005-04-25 17:54
#54171 #54171
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
alarm() in modernen perls kann einen laufenden Perl-Opcode nicht unterbrechen. Und ich vermute, dass die Abarbeitung einer Regexp nur einen Opcode in Anspruch nimmt. Dokumentation: siehe "Safe Signals".
Crian
 2005-04-25 18:07
#54172 #54172
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=Strat,25.04.2005, 15:33]welche perl-version hast du?[/quote]
This is perl, v5.8.6 built for MSWin32-x86-multi-thread

@ptk: d.h.? Es geht so nicht? Alternative?

$composite->data()->[$i]->{re} enthält den vorkompilierten Ausdruck. Das ist auch nicht das Problem, da funktioniert alls, nur abbrechen tut er die Bearbeitung des Ausdrucks nicht.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2005-04-25 18:19
#54173 #54173
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Crian,25.04.2005, 16:07]@ptk: d.h.? Es geht so nicht? Alternative?[/quote]
Wurde hier schon erwaehnt: fork. Alternativ koennte man ab 5.8.1 die Environment-Variable PERL_SIGNALS auf "unsafe" setzen, hat dann aber die ganzen Probleme, die in perlipc, "Deferred Signals" beschrieben sind.
Crian
 2005-04-25 18:39
#54174 #54174
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Das Setzen der Umgebungsvariablen hab ich gerade mal ausprobiert: keine Änderung, bricht trotzdem nicht ab.

Ehrlich gesagt ist mir nicht klar, wie mir fork hier helfen kann.
Ich könnte höchstens im Kind den regulären Ausdruck testen und ihn wenn er schnell genug war, im eigentlichen Programm nochmal ausführen. Oder ich schreibe die Ergebnisse in irgendeine Datei oder oder. Das scheint mir alles sehr langsam.

Argh eigentlich darf man sich echt auf nichts bei größeren Projekten einlassen, was man nicht selbst ganz versteht und bei Bedarf ändern kann. Und dazu gehört wohl leider auch die RE-Maschinerie :( Dabei wäre es so praktisch, einige "black boxes" verwenden zu können, gerade, wenn man unter Zeitdruck steht.

Ich kann mir irgendwie nicht vorstellen, dass ich der erste bin, der Probleme mit zu langsamen RE's hat.

Nur mal zur Klarstellung: Das Programm rechnet (in seiner alten Form) im Moment seit Samstag morgen an der Auswertung eines regulären Ausdrucks, und mir ist nicht klar, warum diese Auswertung so lange braucht. Solche Sachen muss ich einfach kappen, damit der Rest durchlaufen kann. Eigentlich hatte ich 18 Stunden für den Programmlauf eingeplant...\n\n

<!--EDIT|Crian|1114440225-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2005-04-25 19:29
#54175 #54175
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=betterworld,25.04.2005, 15:00]Was steht denn in $composite und den anderen Variablen?

Prinzipiell sollte der Ansatz richtig sein. Folgendes funktioniert auch:
Code: (dl )
perl -le '$SIG{ALRM}=sub {print "abgebrochen"};alarm(2); "" =~ m/(?{{sleep 3}})/'
[/quote]
Ja, das funktioniert bei mir (mit vertauschten Anführungszeichen) auch, aber da ist Perl ja auch nicht wirklich im RE-Teil beschäftigt.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2005-04-25 22:47
#54176 #54176
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das kann auch nicht funktionieren. Denn die Fehlermeldung bei ALRM ist natürlich nicht "alarm\n" sondern so, wie sie bei die üblich ist. Wenn Du ein Wort in das die einbaust, dann teste es mit /\balarm\b/ und dann kann das Wort stehen wo es will.

Außerdem muß nach dem eval-Block auch noch ein alarm 0 rein. Es kann passieren, daß alles gut läuft, Du in die nächste Schleifenrunde eintrittst und die $SIG-sub neu definierst und genau dann kommt der alte alarm. Dann bist Du noch nicht mal im regulären Ausdruck und das eval bricht trotzdem ab. Denke nie nie, es ist nur die Frage der Zeit bis nie trotzdem eintritt - steht so auch im Kochbuch.\n\n

<!--EDIT|steffenw|1114455389-->
$SIG{USER} = sub {love 'Perl' or die};
Crian
 2005-04-26 13:55
#54177 #54177
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
...>perl -e "die qq(alarm\n)"
alarm


?

Der Code kommt direkt aus dem perldoc ^^
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-04-26 15:53
#54178 #54178
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=steffenw,25.04.2005, 20:47]Das kann auch nicht funktionieren. Denn die Fehlermeldung bei ALRM ist natürlich nicht "alarm\n" sondern so, wie sie bei die üblich ist. Wenn Du ein Wort in das die einbaust, dann teste es mit /\balarm\b/ und dann kann das Wort stehen wo es will.[/quote]
die fehlermeldung bei ALRM kommt genau so, wie man sie im Handler angibt... und es timed auch nur aus, wenn man den eval-block beendet, indem man z.B. ein die angibt.
also:
Code: (dl )
$SIG{ALRM} = sub { die "alarm\n" }; 

(das local wuerde ich mir sparen, bin mir nicht sicher, ob das nicht dazwischenpfuscht)

also steht in $@ "alarm\n", womit man sich das \balarm\b sparen kann, und direkt $@ eq "alarm\n" vergleichen kann...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Taulmarill
 2005-04-26 16:01
#54179 #54179
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
nur um mal aus dem momentanen denkmuster ein wenig auszubrechen, hier ein paar vorschläge:

1. mehr/bessere hardware kaufen
2. den regex optimieren (kannst du den mal posten)
3. die daten "häppchenweise" verarbeiten
4. versuchen den daten anzusehen, ob sie in der vorgegebenen zeit abgearbeitet werden können.

evtl. könntest du mal den regex und beispieldaten posten. ansonsten können wir uns ja heut abend eingehender darüber unterhalten.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2005-04-26 16:30
#54180 #54180
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
@taulmarill: Das ist ein (1) regulärer Ausdruck und ein (1) Text, der da so lange läuft. Da kann ich nicht mit Häppchenweise ankommen.

Mit besserer Hardware kann man da auch nix machen, jedenfalls nicht in dem Rahmen. Wenn so ein Regex aus dem Ruder läuft, bringt da besere Hardware leider auch nichts mehr.

Der Ausdruck ist echt harmlos, die Daten auch. Kann ich heute Abend mal mitbringen, posten ist schlecht wegen Firmen-Interna.



@strat: ich hab das local mal weggelassen, aber das wars auch nicht.

Ich hab mich jetzt mal auf den fork-Weg gemacht, aber da komme ich auch nicht weiter. Das Problem bleibt irgendwie das gleiche.

Mein Testprogramm:

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
#!/usr/bin/perl
use strict;
use warnings;

pipe PREAD, CWRITE; # child -> parent

if (fork) {
parent1();
}
else {
child();
}


sub child {
close PREAD; # child - close parent end of pipe

print "child: start of proccess\n";
syswrite CWRITE, "0\n";
for (1..5) {print "child zZZZzzz\n";sleep 1;}
print "child is awaking\n";
syswrite CWRITE, "$_\n" for 1 .. 10;
print "child ending\n";
exit;
} # sub child


sub parent1 {
close CWRITE; # parent - close child end of pipe

chomp(my @erg = <PREAD>);
print "parent got ", join(' - ', @erg), "\n";
print "parent : ", (eof(PREAD)?'ENDE':'keine Ende'), "\n";
} # sub parent1


sub parent2 {
close CWRITE; # parent - close child end of pipes

my @erg;
eval {
$SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm 2;
chomp(@erg = <PREAD>);
alarm 0;
};
if ($@) {
die "other error : $@"
unless $@ eq "alarm\n"; # propagate unexpected errors
warn "parent : child got time out!\n";
}
else {
alarm 0; # Ist das wirklich notwendig?
print "parent got ", join(' - ', @erg), "\n";
print "parent : ", (eof(PREAD)?'ENDE':'keine Ende'), "\n";
}
} # sub parent2


lässt man dies nun mit parent1 laufen, erhält man dieses Ergebnis:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
C:\Daten\perl\fork>f4.pl
child: start of proccess
child zZZZzzz
child zZZZzzz
child zZZZzzz
child zZZZzzz
child zZZZzzz
child is awaking
child ending
parent got 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
parent : ENDE


Lässt man hingegen parent2 los, erhält man exakt das gleiche Ergebnis, und das finde ich echt frustrierend.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 4 5 >| >> 41 Einträge, 5 Seiten



View all threads created 2005-04-25 13:24.