スクリプトファイルのみユニークキーで
KEY=value
形式の行が含まれている場合、あなたはjava.util.Propertiesクラスを使用して、それをロードすることができます。
次に、$WORD
という形式の文字列が含まれていて、WORD
がロードされたプロパティのキーでもある場合は、目的のキーの値を確認するだけです。そうであれば、そのキーの値を再帰的に評価します。しかし、変数がそれ自体で再定義されている場合、このアプローチは無限ループになります。
サンプル・データが可変の再割り当てと再帰を含むので、次に溶液を一度に1つのファイルの各行を評価することであり、メモ化と同様Map
-a法に評価の結果を格納します。
Pattern pattern = Pattern.compile("\\$([A-Z_0-9]+)");
Map<String, String> vars = new HashMap<String, String>();
FileReader f = new FileReader("input");
BufferedReader in = new BufferedReader(f);
for (String line = in.readLine(); line != null;
line = in.readLine()) {
String[] parts = line.split("=", 2);
String key = parts[0];
StringBuffer sb = new StringBuffer();
Matcher m = pattern.matcher(parts[1]);
while (m.find()) {
String var = m.group(1);
m.appendReplacement(sb, vars.get(var));
}
m.appendTail(sb);
String value = sb.toString();
vars.put(key, value);
System.out.println(key + " <= " + value);
}
in.close();
f.close();
}
出力予想通り
JAR_REPO <= /ssnl/col/brf/jar
JAR_LOC <= /ssnl/col/brf/jar/log4.1.1j.jar
JAR_LOC <= /ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar
FINAL_PATH <= /ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar;
:
は、ここでは、コードの要旨です。
「JAR_LOC」は2回目に2回定義されています。これは素朴な再帰的評価(無限ループに陥る)で問題を引き起こす可能性があります。 'JAR_LOC'の最初の名前を' LOG4J_JAR'のようなものに変更すると動作するサンプルコードがあります。 –
'プロパティ'の代わりに、Mapを使用することができます(同じ順序で維持するために 'LinkedHashMap'を使用することをお勧めします)。したがって、値が$を含む反復処理中は、マップからgetvalueを取得します。それでも、値に基づいて解析する必要があります。および/または。意味がありますか? –