2012-02-14 11 views
0

ファイルには、この使用して再帰呼び出しを達成するためにどのように解析スクリプトファイルは

/ssnl/col/brf/jar;/ssnl/col/brf/jar/log4.1.1j.jar;/ssnl/col/brf/jar/SnailClient.jar 

のようになります

JAR_REPO=/ssnl/col/brf/jar 
JAR_LOC=$JAR_REPO/log4.1.1j.jar 
JAR_LOC=$JAR_LOC;$JAR_REPO/SnailClient.jar 
FINAL_PATH=$JAR_REPO;$JAR_LOC; 

FINAL_PATHの期待解析された文字列または値が含まれています。事前に おかげ

ウェルズ

+0

「JAR_LOC」は2回目に2回定義されています。これは素朴な再帰的評価(無限ループに陥る)で問題を引き起こす可能性があります。 'JAR_LOC'の最初の名前を' LOG4J_JAR'のようなものに変更すると動作するサンプルコードがあります。 –

+0

'プロパティ'の代わりに、Mapを使用することができます(同じ順序で維持するために 'LinkedHashMap'を使用することをお勧めします)。したがって、値が$を含む反復処理中は、マップからgetvalueを取得します。それでも、値に基づいて解析する必要があります。および/または。意味がありますか? –

答えて

0

スクリプトファイルのみユニークキーで

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; 

は、ここでは、コードの要旨です。