Ärgerliches if-statement
Bernhard Peissl
- perl
Hallo!
Jetzt, wo sich mein Projekt dem Ende zuneigt(ihr habt also bald wieder Ruhe von mir), scheinen Die Errors nur so aus dem Boden zu schiessen: Hier was ganz blödes, und ich komm einfach nicht dahinter warums nicht funktioniert:
my $ansprechpartner_text = "";
[...]
sub getStaff {
open (GET_STAFF, "mitarbeiter.info") die "can't open mitarbeiter.info: $!\n";
while ($line=<GET_STAFF>) {
chomp($line);
($staff_id, $staff_name, $staff_aufgaben, $staff_tel, $staff_fax, $staff_email, $dummy) = split(/::/,$line);
if ($staff_id eq $lva_ansprechpartner1 $staff_id eq $lva_ansprechpartner1) {
$ansprechpartner_text .= "<p>\n".$staff_name." <!--".$staff_id."-->\n";
$ansprechpartner_text .= "<br>Tel: +43/1/815 08 50 DW ".$staff_tel."\n";
if ($staff_fax) { $ansprechpartner_text .= "<br>Fax: +43/1/815 08 50 DW ".$staff_fax."\n";}
$ansprechpartner_text .= "<br>E-mail: <a href='mailto:".$staff_email."'>".$staff_email."</a></p>";
}
close (GET_STAFF) die "can't close mitarbeiter.info: $!\n";
}
$lva_ansprechparnter1 und 2 werden als Parameter (korrekt) übergeben. Deren Inhalt, und der von $staff_id sind Strings der Form "staff19", "staff13", ...
Wenn ich die Funktion aber aufrufe, und 2 Ansprechpartner an das Script übergeben wurden, dann enthält "$ansprechpartner_text" trotzdem nur den Text für $lva_ansprechpartner2. Der 1.Ansprechpartner wird einfach in den Wind geschossen :-(
Ich sehe aber keinen Fehler! Und im Script wird auch an keiner anderen Stelle etwas an den Variablen $lva_ansprechpartner1/2 und auch nicht an $ansprechpartner_text geändert! Die drei kommen nur in dieser Funktion vor - also muss der Hund irgendwo da begraben sein!
Vielleicht riecht ja einer von euch, wo's hier stinkt ;-)
liebe Grüsse
Bernhard
Hi,
Wenn ich die Funktion aber aufrufe, und 2 Ansprechpartner an das Script übergeben wurden, dann enthält "$ansprechpartner_text" trotzdem nur den Text für $lva_ansprechpartner2. Der 1.Ansprechpartner wird einfach in den Wind geschossen :-(
welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.
Ich sehe aber keinen Fehler!
Ich sehe etwas anderes nicht: $lva_ansprechpartner2
Liegt's vielleicht daran? ;-)
Cheatah
Hallo Cheatah!
welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.
Sorry, anmassend wie ich nunmal bin, hab ich gedacht, so oft wie ich euch jetzt schon mit meinen Problemen bombadiert habe, wisst ihr dass ich ein Kursverwaltungsscript bastle ;-)
$ansprechpartner_text, ist einfach der Text, der am Bildschirm unter der Rubrik "Ansprechpartner" angezeigt werden soll ;-)
Und zwar gibt es für einen Kurs einnal einen, ein anderes mal aber zwei Ansprechpartner. Daher die $lva_anprechpartner1/2 !
Ich sehe aber keinen Fehler!
Ich sehe etwas anderes nicht: $lva_ansprechpartner2
Liegt's vielleicht daran? ;-)
Nein, Kopierfehler, ich probier die ganze Zeit schon rum. Und da gehts bei mir schnell mal drunter und drüber ;-)
liebe Grüsse
Bernhard
Hi,
welcher Text bedeutet was? Bedenke, daß wir in dem Sinn Deines Scripts nicht drinstecken.
Sorry, anmassend wie ich nunmal bin, hab ich gedacht, so oft wie ich euch jetzt schon mit meinen Problemen bombadiert habe, wisst ihr dass ich ein Kursverwaltungsscript bastle ;-)
;-)
Naja, das Problem ist nur, daß ich in den einzelnen Variablen keinen Zusammenhang erkenne. Deine $lva_ansprechpartnerX sind aus meiner Sicht nicht gefüllt, und ich weiß auch nicht, was Du unter welchen Bedingungen wo als Rückgabe erwartest.
Cheatah
Hi!
Naja, das Problem ist nur, daß ich in den einzelnen Variablen
keinen Zusammenhang erkenne. Deine $lva_ansprechpartnerX sind aus
meiner Sicht nicht gefüllt, und ich weiß auch nicht, was Du unter
welchen Bedingungen wo als Rückgabe erwartest.
Der Mitarbeiter wird mit einem Formular konfrontiert, in das er die
Daten des Kurses, den er ins Netz stellen will reinschreiben soll.
Unter anderem sind da zwei select-boxes, wo er anklicken muss, wer
als Ansprechpartner herhalten muss ;-)
Dieses Formular, wenn abgeschickt ruft mein script auf, welches das
ganze KrimsKrams in eine Datei speichert. Die wird dann bei einem
Aufruf vom Browser des Kunden angezapft und mit einem zweiten script
dem Bildschirm des Kunden dargeboten ;-)
$lva_ansprechpartnerX werden als Parameter vom Formular ans in-die-
datei-schreibende Perl-Script übergeben. Habe ich kontrolliert, das
klappt! Sie kommen richtig rüber, nur wird die if-Bedingung
anscheinend nur einmal erfüllt!
Die Daten der Mitarbeiter habe ich in einer eigenen Datei abgelegt:
mitarbeiter.info Dort steht ungefähr folgendes:
staff11::Name::Aufgabenbereich::telefonnr::faxnr::email::...
und die Daten aus der Datei werden dann zwischenzeitlich in
$ansprechpartner_text abgelegt, und dann im Hauptprogramm einfach in
die Kursdatei geschrieben:
print KURS "Preis:$preis_text\n";
print KURS "Ansprechpartner:$ansprechpartner_text\n";
...
die _text Variablen bereiten einfach den Text vor, der dann in die
Datei kommt.
"lva" steht übrigens für Lehrveranstaltung.
So, ich hoffe ich habs halbwegs nachvollziehbar erklärt ;-)
liebe Grüsse,
Bernhard
PS: Das ganze Script steht auf http://www.wt-akademie.at/schreibeDetail.pl.txt
Hallo Bernhard,
sub getStaff {
open [...]
while () {
if (){
if () { }
}
close [...]
}
Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.
Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hallo Bernhard,
sub getStaff {
open [...]
while () {
if (){
if () { }
}
close [...]
}
Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.
Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hallo Bernhard,
sub getStaff {
open [...]
while () {
if (){
if () { }
}
close [...]
}
Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.
Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hallo Bernhard,
sub getStaff {
open [...]
while () {
if (){
if () { }
}
close [...]
}
Irgendwie scheinen Deine Klammern mit Dir durchzugehen ;-) Entweder hast Du die schließende Klammer der Subroutine nicht kopiert. Dann schließt Du Deine Datei beim ersten Durchlauf der Schleife. Oder es fehlt die Klammer der while-Schleife. Dann wundert es mich allerdings, daß überhaupt irgendwas geht.
Wenn man davon ausgeht, daß die Reihenfolge der Klammern stimmt (nur die schließende fürs Sub fehlt), dann wird die Schleife nur einmal durchlaufen, weil "Read from closed Filehandle" imho keinen Wert zurückliefern sollte ;-) Wenn Du nun zufällig die $staff_id von $lva_a...2 als erstes in der Datei steht, dann wir eben nur diese mit $ansprechpartener_text verknüpft.
Hoffentlich stinkt es nicht mehr so, wenn Du das nochmal überprüft hast.
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hi!
Also das habe ich jetzt schon öfters beobachtet, und es gibt mir ein wenig zu denken: Jedesmal wenn ich ein Script zum Anschauen online stelle, dann scheint es euch die Sprache zu verschlagen ! Bin ich denn echt so schlecht :-(
Aber zu meinem Problem, das hat sich heute morgen in Luft aufgelöst: Als ich den PC aufgedreht habe, lief alles wie am Schnürchen, ohne dass ich etwas geändert hätte!
Ein unerklärliches Phänomen. Vielleicht beglückt der Forumsgeist manchmal auch seine Besucher mit seiner Anwesenheit ;-)
Naja, jetzt gehts jedenfalls :-)
liebe Grüsse
Bernhard
Hallo Bernhard,
Also das habe ich jetzt schon öfters beobachtet, und es gibt mir ein wenig zu denken: Jedesmal wenn ich ein Script zum Anschauen online stelle, dann scheint es euch die Sprache zu verschlagen !
Ich hab` schon mal reingeschaut, aber konnte nicht gleich was entdecken. Und nebenbei betreibe ich, wie vielleicht auch andere, noch eine Hauptbeschäftigung sowie weitere Nebenbeschäftigungen (Hier verkehren also nicht nur Studenten, Hausfrauen, Arbeitslose und Rentner ;-)
Bin ich denn echt so schlecht :-(
Nicht wirklich ;-) Aber imho gibt es schon noch ein paar Anmerkungen *g* (Imho ist meine Programmierstil auch nicht sonderlich gut, aber man lernt ja nie aus. Ich kenne auch nur einen, der von sich behauptet, seine Programmierkünste wären nicht nur scheinbar grandios ;-).
Ich will jetzt nicht den Perl-Lehrer spielen, das können andere besser, aber ich möchte einige Sachen anmerken, die _ich_ mir im Laufe der Zeit angewöhnt habe (und vielleicht auch einige andere):
Als erstes deklariere alle Variablen mit my(), local() oder use vars(). Dabei hilft "use strict;" Andernfalls machst Du alle Variablen der Subroutinen global, was Dir früher oder später Scherereien verursachen kann (außerdem gibts afaik Ärger mit mod_perl ;-).
Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert in eine globale Variable schreiben zu lassen. "$wert = &getWert();" ist imho aussagekräftiger für jemanden, der Deinen Code lesen muss ;-) Außerdem funktionieren so ähnlich auch Perls interne Funktionen: entweder sie geben einen Wert zurück den Du haben möchtest (shift(),join()), oder sie verändern den übergebenen Wert (chomp()) [ganz grob gesagt ;-)]
Optimierungspotential liegt, wie wir in einem Posting von ?weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich verwende "" nur dann, wenn der String nach Variablen geparst werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich '' vor, was afaigh (asfarasigelesesenhab ;-) Dein Skript beschleunigen kann (ich weis nicht, ob Stringparsen viel langsamer ist als viele Stringverknüpfungen, aber das kann sicher einer der Eggsbädde beantworten;-)
Zu Deinem alten Problem mit $laenge = @_; :
Das brauchst Du eigentlich gar nicht, da Du ja alle Elemente von @_ verändern willst. Schreibe doch einfach "foreach (@_){}". Das spart Dir zwei Variablen (ist ja noch nicht so viel), und vor jede Zeile $_[$i] zu schreiben (das ist ein wenig mehr *g*), da sich nun die Elemente von @_ in $_ durchgereicht werden.
Einen "Verbesserungsvorschlag" hätte ich auch noch :-) Statt für jedes Tag "$_[$i] =~ s/[br]/<br>\n/g;" zu schreiben, kannst Du auch folgende RegEx verwenden, die imho leichter zu erweitern ist:
my @tags = ('br','p','b','u','i');
my $regex = join('',@tags);
foreach (@_) {
s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
. ^......^..........^........sicherheitshalber, man kann ja nie wissen ;-)
. kann man aber auch weglassen und so eine saubere Eingabe erzwingen
}
Wie Du siehst, brauchst Du nur dem Array die zu erkennenden Tags einverleiben und feddisch :-)
Ob das performanter ist, kann ich nicht beantworten. Perl kompiliert normalerweise RegEx beim Skriptaufruf. Enthält die RegEx jedoch Variablen, wird der Ausdruck erst zur Laufzeit kompiliert (die Variable könnte sich ja ändern). Das kann die Performance beeinträchtigen (z.B.: bei häufigem Aufruf oder bei "großen" RegEx wie zur Erkennung von rfc-konformen URLs ;-), ist aber hier vermutlich nicht relevant. Damit die RegEx nur einmal zu Laufzeit kompiliert wird, kann man den Modifier 'o' verwenden (compile once).
Vielleicht fällt jemand Anderem noch etwas zum Thema ein. Ansonsten, wie sollte es bei Perl auch anders sein, gibt es zu allem eine Doku: perldoc perlstyle ;-) (Aber jeder findet irgendwie seinen Stil)
Aber zu meinem Problem, das hat sich heute morgen in Luft aufgelöst:
[...]
Naja, jetzt gehts jedenfalls :-)
Dann wieder viel Spaß mit Perl :-)
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hallo Alex,
Erst mal danke für deine lange Antwort!
Ich hab` schon mal reingeschaut, aber konnte nicht gleich was
entdecken. Und nebenbei betreibe ich, wie vielleicht auch andere,
noch eine Hauptbeschäftigung sowie weitere Nebenbeschäftigungen
(Hier verkehren also nicht nur Studenten, Hausfrauen, Arbeitslose
und Rentner ;-)
Sollte ja um Himmels willen kein Vorfurf gewesen sein! Ich dachte ja
es läge an mir ;-)
Aber imho gibt es schon noch ein paar Anmerkungen *g* (Imho ist
meine Programmierstil auch nicht sonderlich gut, aber man lernt
ja nie aus.
Genau das will ich ja auch damit bezwecken! Wenn ihr schon mal dabei
seid, einen Fehler in meinem Script zu suchen, dann habt ihr
sicherlich vorher schon 100 Sachen gefunden, die euch am Nerv gehen,
weil zu umständlich programmiert. Und ich freu mich, wenn ihr mir
sagt, was ich besser machen müsste. Denn ich arbeite alleine, und
hab somit kein Team, wo ich mir von den Besseren was abschauen
könnte ;-( Das Forum hier und ein paar Bücher sind also meine
einzigen Quellen! Und sooooo lange bin ich ja auch noch nicht in
diesem business -Vor zwei Jahren wusste ich noch nicht mal, wie ich
eine email verschicken kann ;-)
Ich will jetzt nicht den Perl-Lehrer spielen, das können andere
besser, aber ich möchte einige Sachen anmerken, die _ich_ mir im
Laufe der Zeit angewöhnt habe (und vielleicht auch einige andere):
Als erstes deklariere alle Variablen mit my(), local() oder use
vars(). Dabei hilft "use strict;" Andernfalls machst Du alle
Variablen der Subroutinen global, was Dir früher oder später
Scherereien verursachen kann (außerdem gibts afaik Ärger mit
mod_perl ;-).
Scherereien hats bereits genug gegeben :-( Ich habe vorher alles in
eine‚m script gehabt (Termine anzeigen, Detailprogramm anzeigen,
Kursübersicht anzeigen, Anmeldeformular anzeigen, und
Anmeldeformular verarbeiten) Wie du dir vorstellen kannst, das reine
Chaos :-(
Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert
in eine globale Variable schreiben zu lassen. "$wert = &getWert
();" ist imho aussagekräftiger für jemanden, der Deinen Code
lesen muss ;-)
Ich komme ja eigentlich mit ein bissi c/c++ background in die Web-
Programmierung. Da muss man sowieso jede Variable vorher
deklarieren. Aber dadurch dass es bei den Scriptsprachen so einfach
geht, auch dank dem Konzept der globalen Variablen, zwingt einen
keiner dazu objektorientiert (var Wert; getWert(); setWert();..) zu
arbeiten, bzw. sich zu überlegen, welche Variablen man braucht.
Daher auch mein zwiespältiges Verhältnis zu Javascript, Perl, und
Co. Man kann verdammt viel damit machen, aber wenn man sich nicht
auskennt, kostet es einem viele graue Haare ;-(
Optimierungspotential liegt, wie wir in einem Posting von ?
weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich
verwende "" nur dann, wenn der String nach Variablen geparst
werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich ''
vor,
Du meinst bei print '' statt "" ?
my @tags = ('br','p','b','u','i');
my $regex = join('',@tags);
foreach (@_) {
s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
Bevor ich diese Hieroglyphen in mein Script einbaue muss mir jemand sagen was das heissen soll. Vor allem: Wieso sind da Rufzeichen ! statt den Slashes / ??????
[ ....... ist klar was das macht!
s* ....... alle \r\t\n\b rausschmeissen
(/) .‚... falls </EndTag> (sollte es dann nicht / heissen? ein
slash muss doch maskiert werden oder)
] ....... ist auch klar!
<$1$2> ... was ist in dem Fall $1 (\s* oder /) und was ist $2
($regex oder eins der \s*)?
!????? ... und was sind diese Rufzeichen ????
Conclusio: Ich nehme mal an, diese RegExpr. wandelt alle [tags] in
<tags> um! Wäre die umgekehrte Version dann:
s!<\s*(/)\s*($regex)\s*>![$1$2]!oig;
????
Vielleicht fällt jemand Anderem noch etwas zum Thema ein.
Ansonsten, wie sollte es bei Perl auch anders sein, gibt es zu
allem eine Doku: perldoc perlstyle ;-) (Aber jeder findet
irgendwie seinen Stil)
Ich werde meinen wohl nie finden :-(
Dann wieder viel Spaß mit Perl :-)
Scherzkeks ;-)
liebe grüsse,
bernhard
Hallo Bernhard,
[...]
Sollte ja um Himmels willen kein Vorfurf gewesen sein! Ich dachte ja
es läge an mir ;-)
So hab` ich das auch nicht aufgefasst :-) Der Scherz ist wohl missglückt ;-)
[...]
Aber dadurch dass es bei den Scriptsprachen so einfach
geht, auch dank dem Konzept der globalen Variablen, zwingt einen
keiner dazu objektorientiert (var Wert; getWert(); setWert();..) zu
arbeiten, bzw. sich zu überlegen, welche Variablen man braucht.
Genau deshalb sollte man immer "use strict;" verwenden. In meine Anfängen mit Perl hab` ich das auch ignoriert, und musst immer wieder falsch geschriebene Variablen korrigieren, bzw. ziemlich viele Variablennamen ausdenken ;-)
Objektorientiert muss man imho nicht unbedingt programmieren. Aber Variablen- und Routinenbezeichnungen sowie Zuweisungen sollten einigermaßen selbsterklärend sein. Wenn irgendwo eine Subroutine aufgerufen wird, der "keine" Variable übergeben wird, und die "keinen" Wert zurückliefert, macht einen das schon stutzig ;-)
Daher auch mein zwiespältiges Verhältnis zu Javascript, Perl, und
Co. Man kann verdammt viel damit machen, aber wenn man sich nicht
auskennt, kostet es einem viele graue Haare ;-(
Und es kostet Nächte die man ruhig durchschlafen kann (ging mir bei meinem ersten größeren Projekt http://ahnenforschung.net so :-)
Du meinst bei print '' statt "" ?
Genau, aber auch bei Zuweisungen und Stringverknüpfungen verwende ich "" nur, wenn sich im String Steuerzeichen oder eine Variable befinden.
s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
Bevor ich diese Hieroglyphen in mein Script einbaue muss mir jemand sagen was das heissen soll. Vor allem: Wieso sind da Rufzeichen ! statt den Slashes / ??????
Hier empfiehlt sich wieder mal perldoc perlre ;-) Perl bietet Dir fast alle Freiheiten, so auch die, Deine Begrenzer für den Regulären Ausdruck in gewissem Rahmen zu wählen. So ist s### genauso zulässig wie s!!!. Mann kann sogar Klammerpaare verwenden: s()() aber auch mischen s<>// [Falls vorne Klammern, dann muss der hinter Begrenzer auch paarig sein].
Das ist besonders sinnvoll, wenn Dein Suchausdruck viele Slashs enthält, wie zB. eine URL. So musst Du nicht jeden Slash quoten, bzw. eine Variable durch quotemeta() jagen (http://blablablub/sadf...arrgh ;-). Allerdings musst Du dann imho die im Ausdruck zu findenen Begrenzer quoten (zB.: !). Bei einfachem Patternmatching mit m## ist dann aber das 'm' zwingend, bei m// darf es fehlen.
[ ....... ist klar was das macht!
s* ....... alle \r\t\n\b rausschmeissen
einfach alle Whitespaces, also auch Leerzeichen. Das kann man auch wieder rausnehmen. Es ist so aber ein wenig toleranter gegen Fehleingaben ;-) ([ / b ])
(/) ..... falls </EndTag> (sollte es dann nicht / heissen? ein
slash muss doch maskiert werden oder)
Siehe oben: Maskiert werden muss der Slash nur, wenn er als Begrenzer/Klammernpaar dient.
] ....... ist auch klar!
<$1$2> ... was ist in dem Fall $1 (\s* oder /) und was ist $2
($regex oder eins der \s*)?
$1 und $2 enthalten das Suchergebnis der entsprechenden Klammern. (?:$regex) gruppiert zwar ebenfalls, verhindert aber, daß der Treffer der Klammer in $1..$9 gespeichert wird.
Und hier kommt gleich noch eine Änderung der RegEx :-): (die Erfassung von Whitespaces hab ich mal weggelassen. Schließlich muss man die User ein wenig zu richtigen Eingaben disziplinieren ;-)
s![((?:/)(?:$regex))]!<$1>!oig;
^................^....die äußeren Klammern werden mit $1 "refernenziert", da in den beiden innern mit (?: ein Backtracking unterbunden wird.
[...]
Ich hoffe das bringt Dich wieder auf den rechten Pfad eines Perljüngers ;-)
Gruß AlexBausW
Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html
Hallo Bernhard,
So hab` ich das auch nicht aufgefasst :-) Der Scherz ist wohl
missglückt ;-)
;-)
Genau deshalb sollte man immer "use strict;" verwenden. In meine
Anfängen mit Perl hab` ich das auch ignoriert, und musst immer
wieder falsch geschriebene Variablen korrigieren, bzw. ziemlich
viele Variablennamen ausdenken ;-)
*g* das kenn ich ;-)
Und hier kommt gleich noch eine Änderung der RegEx :-)
Das macht echt Spass gell? Naja, vielleicht kapier ich das Zeugs
auch irgendwann mal, und dann darf ich mit den greenhorns im Forum
auch solche Spässe treiben ;-)
s![((?:/)(?:$regex))]!<$1>!oig;
^................^....die äußeren Klammern werden mit
$1 "refernenziert", da in den beiden innern mit (?: ein
Backtracking unterbunden wird.
Ich hatte mal eine Informatikprüfung auf der Uni, zum Thema
Rekusrionen und Backtracking. Ich bin zweimal durchgeflogen :-(
Ich hoffe das bringt Dich wieder auf den rechten Pfad eines
Perljüngers ;-)
Amen,
Bernhard
Moin!
Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert in eine globale Variable schreiben zu lassen. "$wert = &getWert();" ist imho aussagekräftiger für jemanden, der Deinen Code lesen muss ;-)
Sehr richtig, und verdammt wichtig. Nichts ist so wartungsunfreundlich wie globale Variablen, die von allen moeglichen Funktionen wild veraendert werden. Finde mal alle diese Stellen in einem 1000-Zeilen-Programm (was ja noch sehr klein ist). Das ist wirklich eine der wichtigsten Regeln beim Programmieren, deswegen will ich das an dieser Stelle einfach nochmal betonen. :-)
Optimierungspotential liegt, wie wir in einem Posting von ?weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich verwende "" nur dann, wenn der String nach Variablen geparst werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich '' vor, was afaigh (asfarasigelesesenhab ;-) Dein Skript beschleunigen kann (ich weis nicht, ob Stringparsen viel langsamer ist als viele Stringverknüpfungen, aber das kann sicher einer der Eggsbädde beantworten;-)
Weiss ich auch nicht, aber ob man bei Strings, die nicht interpoliert werden sollen (also Variablen enthalten), " oder ' schreibt, ist imho ziemlich egal. Gut, zur Kompilierzeit muss Perl mal eben checken, ob Variablen enthalten sind, wenn man die interpolierenden Quotes (also ") verwendet, aber zur Laufzeit ist das dann schon in interne Strukturen umgesetzt und sollte keinen Unterschied mehr machen.
Deinen dynamischen RegExp schau ich mir jetzt mal nicht an, da bin ich noch zu besoffen dazu. ;-) Aber an Bernhard wegen der ! statt / lies mal <../../sfarchiv/2000_3/t21729.htm#a111615>, und natuerlich perldoc perlop Abschnitt "Quote and Quote-like Operators".
So long
Hallo Calocybe!
Sehr richtig, und verdammt wichtig. Nichts ist so
wartungsunfreundlich wie globale Variablen, die von allen
moeglichen Funktionen wild veraendert werden. Finde mal alle
diese Stellen in einem 1000-Zeilen-Programm (was ja noch sehr
klein ist). Das ist wirklich eine der wichtigsten Regeln beim
Programmieren, deswegen will ich das an dieser Stelle einfach
nochmal betonen. :-)
Genau dieses Problem hat euch schon einige Verzweiflungs-postings
meinerseits eingebracht ;-)
Deinen dynamischen RegExp schau ich mir jetzt mal nicht an, da
bin ich noch zu besoffen dazu. ;-)
Na sag mal! Wo treibst du dich denn rum, dass du um halb zwei
nachmittags noch/schon besoffen bist ;-)
Aber an Bernhard wegen der ! statt / lies mal
<../../sfarchiv/2000_3/t21729.htm#a111615>, und
natuerlich perldoc perlop Abschnitt "Quote and Quote-like
Operators".
Danke!
Liebe Grüsse
Bernhard