2016-07-06 13 views
2

I make ‚s eval Funktion nutzen möchten mehrere definieren (dynamisch genannt) Variablen innerhalb einer foreach, aber ich kann nicht eval bekommen diesen Job zu machen.machen - mehrere Variablen in der gleichen eval Aufruf definieren

Ich habe versucht, so etwas wie dieses:

$(eval \ 
    var1 = val1 \ 
    var2 = val2 \ 
) 

Es funktioniert nicht: var1 als val1 var2 = val2 definiert wird und var2 ist nicht definiert. Es macht Sinn, denn ich setze \ am Ende der zweiten Zeile. Aber wenn ich es entferne, wird der eval Anruf nie beendet.

Ich versuchte verschiedene Dinge zu haben \ nur von eval gesehen, aber nichts hat den Trick. Daher die Frage: ist es möglich, mehrere Variablen im selben eval Aufruf zu definieren?

Natürlich könnte ich eval zweimal anrufen ... es ist eher Neugier.

+0

Ich glaube nicht, dass es möglich ist, weil Sie auf eine allgemeinere Weise nicht zwei Variablen in derselben Zeile deklarieren können. Es muss aufgrund der Art, wie parse die Variablendeklaration ist. Wie auch immer, Sie können mehrere Eval-Funktionen in eine definierte Funktion einfügen und nur diese Funktion aufrufen, so dass nur eine Zeile beim Aufruf benötigt wird. – Tim

+0

@TimF Ich denke du hast Recht. Aber da 'eval' verwendet werden kann, um das Ergebnis von' call' zu analysieren, was mehrzeilig ist, erwartete ich, dass ich in der Lage bin, eine "mehrzeilige literale Zeichenfolge" zu schreiben. – lephe

+0

Ich habe mehrere Lösungen ausprobiert und endlich eine Antwort gefunden, siehe unten;) – Tim

Antwort

2

Was jede Variablendefinition trennt, ist das Newline-Zeichen, das Sie mit dem umgekehrten Schrägstrich verlassen. Da Sie es nicht direkt in der eval Funktion setzen können, müssen Sie es zu definieren, und es zu verwenden, um in eval wie folgt aus:

define newline 


endef 

Dann, wenn Sie die folgenden Zeilen in einem Ziel setzen:

$(eval FOO=abc$(newline)BAR=def) 
@echo FOO : $(FOO) BAR : $(BAR) 

Sie werden dieses Ergebnis haben:

FOO: abc BAR: def

Beachten Sie, wenn Sie eine Variable in der Definition des zweiten verwenden wollen, müssen Sie das $ -Zeichen wie folgt zu entkommen:

$(eval FOO=abc$(newline)BAR=def$$(FOO)) 
@echo FOO : $(FOO) BAR : $(BAR) 

Das Ergebnis wird schließlich:

FOO: abc BAR: defabc

Dies ist aufgrund der Tatsache, dass es eine erste Ebene der Interpretation ist, bevor die eval tatsächlich beginnt seine Arbeit zu tun (die Neuen-Zeile wird hier hinzugefügt), aber wir wollen die Interpretation der Variable nur während der realen eval Arbeit auftreten, wenn die Variable definiert ist, weshalb wir ein doppeltes $ -Symbol benötigen.

+0

Das ist schlau. Es macht den Code leichter, wie ich es wollte. +1 – lephe

+0

Es scheint, dass dieser Trick nicht funktioniert, wenn die zweite Variable die erste verwendet, z. 'FOO = abc $ (Zeilenumbruch) BAR = FOO'. In diesem Beispiel bleibt BAR leer. – lephe

+0

@lephe: Sehen Sie das Ende meiner Antwort, ich habe es bearbeitet, um hinzuzufügen, was Sie suchen. – Tim