"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

javascript: array of functions - parameter?

wergor 15.12.2016 - 14:16 2679 5
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
ich parse eine .ini file mit kommandos darin und erstelle ein array von funktionen. manche der kommandos haben zusätzlich einen parameter, z.b.:
Code: INI
[Commands]
command_0 = Wait(500)
die kommandos werden in ein array aus funktionen übersetzt:
Code: JS
if (command.match(/^Wait\((.*)\)$/))        //matches Wait(xxx)
    sequence.commands.push(function() {
        var time = command.match(/^Wait\((.*)\)$/)[1];
        return sleep(time + "ms");
    });
das beispiel oben funktioniert wie gewünscht. das beispiel unten nicht: hier ist zur laufzeit die variable "command" (die mit RegEx ausgewertet wird) undefined.
Code: JS
if (command.match(/^PowerOn(\((.*)\))?$/))        //matches ^PowerOn$ and ^PowerOn(xxx)$
    sequence.commands.push(function() {
        if (command.match(/^PowerOn(\((.*)\))?$/)[2]) {    //sets voltage if voltage has been given
            var voltage = command.match(/^PowerOn\((.*)\)$/)[2] * 10e3;        //convert from V to mV
            setParameter("Voltage", voltage);
        }
        return setContact("VCC", true);
    });

ich finde den fehler nicht, hat jemand von euch eine idee, oder einen vorschlag wie man das besser lösen kann?
Bearbeitet von wergor am 15.12.2016, 14:18

JC

Administrator
Disruptor
Avatar
Registered: Feb 2001
Location: Katratzi
Posts: 9067
Warum escapst du die Klammern nicht?

command.match(/^PowerOn(?:\((\w+)\))?$/)

Zum Testen würde ich persönlich
Code: JS
/regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf
Code: JS
var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen.

ill

...
Avatar
Registered: Nov 2003
Location: Salzburg
Posts: 2059
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
Zitat von JC
Warum escapst du die Klammern nicht?

command.match(/^PowerOn(?:\((\w+)\))?$/)

Zum Testen würde ich persönlich
Code: JS
/regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf
Code: JS
var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen.
die klammern sind optional. falls sie existieren muss ich den wert darin übernehmen.

Zitat von ill
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
der code oben ist im selben scope (ist eine liste von else if (command.match(x)) {} ), wird aber in einem anderen scope ausgeführt, wo command nicht existiert. ich habe es zuerst mit Wait versucht, und weil das funktioniert hat bin ich davon ausgegangen dass entweder die regex zum zeitpunkt des erstellens ausgewertet wird (und in der funktion dann command nicht mehr benötigt wird) oder command im scope behalten wird. offenbar ist aber beides nicht der fall, deshalb frage ich mich warum das beispiel mit Wait funktioniert :confused:

JC

Administrator
Disruptor
Avatar
Registered: Feb 2001
Location: Katratzi
Posts: 9067
Zitat von wergor
Zitat von ill
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?

Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
Die Klammern bilden doch immer eine Capturing Group, außer du escapst sie.

Dein Beispiel mit Wait erzeugt zwei Capturing Groups, wobei beide immer den gleichen Inhalt besitzen. Zudem ist in deiner Gruppe immer die Klammer inkludiert, also in deinem Beispiel "(500)". Dein Beispiel funktioniert nur wegen dem Dot-Star und würde etwa auch "Waitfoobar" oder "Wait for me, darling!" matchen.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4095
jetzt verstehe ich was du meinst. die klammern werden schon escaped, aber die forensoftware hat die "\" beim posten offenbar gelöscht. die klammern sind optional, falls sie existieren enthält die erste capturing group "(value)" und die zweite "value", deshalb arbeite ich in den skripts nur mit capturing group 2 (ausnahme: "Wait" hat immer die klammern, deshalb ist die regex in den fall etwas anders)
was in den klammern tatsächlich drin steht ist für mich nicht so wichtig - wenn keine zahl übergeben wird wirft das framework beim aufruf der funktion einen fehler und herr dipl.ing. user muss seine .ini files fixen ;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz