У меня есть файл KML размером ~ 35 МБ, в котором все метки имеют имена «kml1234» и тому подобное. Я хочу заменить имя удобочитаемой строкой, например «Зона 9987», и у меня есть таблица поиска. Я нашел фрагмент perl здесь (https://stackoverflow.com/a/6435950), и он работал для большинства метки. Однако я обнаружил, что в определенных случаях это не сработало. Вот код.
$repl{kml1} = "Area A";
$repl{kml12} = "Area B";
$repl{kml123} = "Area C";
$repl{kml69} = "Area D";
$repl{kml4458} = "Area E";
$s = <<HEADER;
\$start = time;
open(F, "input.txt");
open(OUTPUT, ">output.txt");
while (<F>) {
HEADER
foreach $key (keys %repl) {
$s .= "s/$key/$repl{$key}\/;\n"
}
$s .= <<FOOTER;
print \$_;
}
close(F);
close(OUTPUT);
print "Elapsed time (eval.pl): " . (time - \$start) . "\r\n";
FOOTER
eval $s;
Я протестировал это изолированно, используя тестовую строку (помещенную в input.txt):
<Placemark id="kml123">
Ожидаемый результат от этого:
<Placemark id="Area C">
Однако, если я снова запущу скрипт с теми же входными данными (kml123), я получу один из трех результатов ниже:
<Placemark id="Area A23">
<Placemark id="Area B3">
<Placemark id="Area C">
Кажется, что подстановка каким-то образом усекает $key только до kml1 или kml12 иногда? Я замечаю, что никогда не получаю «Область D» или «Область E», которые ожидаются, и я подозреваю, что это потому, что они недостаточно похожи на kml123, только первые 3. Любые подсказки?