Файл сценария анализа (с использованием Java) - PullRequest
0 голосов
/ 14 февраля 2012

Файл содержит

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 будет выглядеть как

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

Как этого добиться с помощью рекурсивного вызова.Заранее спасибо

Уэллс

1 Ответ

0 голосов
/ 14 февраля 2012

Если файл скрипта будет содержать только строки вида

KEY=value

Используя уникальные ключи, вы можете загрузить его, используя java.util.Properties class.

Затем все, что вам нужно сделать, это проверить значение требуемого ключа, если он содержит какие-либо строки вида $WORD и если WORD также является ключом в загруженных свойствах. Если это так, то рекурсивно оцените значение этого ключа. Однако этот подход попадет в бесконечный цикл, если переменная будет переопределена в терминах самой себя.


Поскольку ваши данные выборки включают в себя переменное переназначение и рекурсию, тогда решение состоит в том, чтобы оценивать каждую строку файла по одному и сохранять результаты оценки в Map - методике, аналогичной запоминанию.

Вот суть кода:

    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;

Как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...