2016-07-06 8 views
2

に複数の変数を定義しますが、私はこの仕事をするevalを取得することはできません。それは動作しませんメイクは - 私は<code>foreach</code>内でいくつかの(動的な名前の)変数を定義する<code>make</code>の<code>eval</code>機能を使用したいと同じevalを呼び出し

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

var1val1 var2 = val2として定義されますとvar2が定義されていない

私はこのような何かを試してみました。私は \を2行目の末尾に置いているので意味があります。しかし、削除すると、 evalコールは決して終了しません。

\しか表示されていない別のものを試しましたが、evalでしか見られませんでしたが、そのトリックはありませんでした。したがって、疑問:複数の変数を同じeval呼び出しで定義することは可能ですか?

もちろん、私はevalを2回呼び出すことができます...それはむしろ好奇心です。

+0

より一般的なやり方では、同じ行に2つの変数を宣言することはできないので、私は可能ではないと思います。これは、parseを変数宣言にする方法が原因であるに違いありません。とにかく、定義された関数に複数の評価関数を入れ、この関数だけを呼び出すことができるので、呼び出し時には1行しか必要としません。 – Tim

+0

@TimFあなたが正しいと思います。しかし、 'eval'を使って' call'の結果を解析することができるので、 ''複数行のリテラル文字列 ''を書くことができるようになりました。 – lephe

+0

私は複数の解決策を試して、最終的に答えを見つけました。下記を参照してください;) – Tim

答えて

2

各変数定義を区切るのは、改行文字で、バックスラッシュでエスケープします。

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

:あなたは、ターゲット内の次の行を配置する場合は、

define newline 


endef 

:あなたはeval機能に直接それを置くことができないので、あなたはそれを定義し、このようevalにそれを使用する必要があります

FOO::ABCのBAR:DEF

あなたはこの結果を持っています

注2番目の1の定義で変数を使用したい場合は、このような$文字をエスケープする必要があること:

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

は、結果は最終的には次のようになります。

FOO:ABC BAR:defabcは

これはevalが実際にその仕事を(改行がここに追加された)を行うために開始する前に、解釈の最初のレベルがあることに起因しているが、我々は解釈をしたいです変数が定義されている実際のeval作業中にのみ発生するため、二重$記号が必要です。

+0

それは賢いです。それは私が求めているようにコードを軽くします。 +1 – lephe

+0

2番目の変数が最初の変数を使用する場合、このトリックは機能しません。 'FOO = abc $(改行)BAR = FOO'です。この例では、BARは空のままです。 – lephe

+0

@lephe:私の答えの最後を見て、あなたが探しているものを追加するためにそれを編集しました。 – Tim

関連する問題

 関連する問題