Здравствуйте, уважаемые коллеги!
Помогите, пожалуйста!
подскажите, каким образом можно найти в документе Word все слова, перед которыми стоит специальный знак (например, '*') и записать их в массив, затем все полученные слова (вместе с предшествующим знаком) заменить на другой текст?
пока пришло такое решение (поиск меток):
$WordsCount = $File->Words->{Count};
my $pword;
for $i (1..$WordsCount){
$word = $File->Words($i)->{Text};
if ($pword eq '*' ) {
push @$words ,$word;
}
$pword = $word;
}
и затем произвести замену с помощью этого
my $search = $doc-> Content->Find;
my $replace = $search-> Replacement;
$search-> {Text} = $oldtext;
$replace-> {Text} = $newtext;
$search-> Execute({Replace => wdReplaceAll});
Но я думаю, что есть более эффективный метод.
Метод с закладками (bookmarks) мне не нравится, потому что неудобно клепать шаблоны. Намного нагляднее в тексте шаблона видеть метки, поэтому этот метод предлагать не нужно (уже есть у меня готовое решение с использованием закладок).
Добавлено через 1 час, 45 минут и 39 секунд:В общем, у меня получился такой код для поиска и замены меток вида *Name
my $Word = CreateObject Win32::OLE 'Word.Application' or die $!;
$Word->{'Visible'} = 1;
my $File = $Word->Documents->Open(abs_path($ARGV[0]));
#$ActiveDoc = $Word->ActiveDocument;
my $replaces={'PrikazNum'=>'Номер приказа 222', 'Date'=>'Дата: 2010-01-02', 'sign'=>'Подпись: 2222'};
my $myRange = $File->Content;
while ($myRange->{Find}->Execute ({FindText=>'*', Forward=>1}) ){
$foundrange=$myRange->Next({Unit=>wdWord, Count=>1});
$repltext = $replaces->{$foundrange->{Text}};
$foundrange->MoveStart({Unit=>wdCharacter, Count=>-1});
print "'$foundrange->{Text}' заменяем на '$repltext'\n";
$foundrange->{Text} = $repltext;
}
Вопрос остался такой: как избежать появления пробелов в $foundrange->{Text} ? Сюда пробел попадает, другие символы нет (если в документе встречаются).