I don't do much Win32 these days either. As you say you need to deliver the expected. Here is an amusing snippet, relevant to the current:
sub word_find_and_replace {
my ( $word, $rel_file_path, $tokens_ref ) = @_;
# first make a temporary file to do the search and replace on
my ( $fh, $temp_name ) = get_tempfile( "$DOC_DIR/system", 'doc' );
close $fh;
my $content_ref = read_file( "$DOC_DIR/$rel_file_path" );
create_file( "$DOC_DIR/system/$temp_name", $content_ref, 'overwrit
+e ok' );
$word->{visible} = 0;
my $doc = $word->{Documents}->Open("$DOC_DIR/system/$temp_name");
my $search_obj = $doc->Content->Find;
my $replace_obj = $search_obj->Replacement;
for my $token ( keys %$tokens_ref ) {
my $find = '<?' . $token . '?>';
my $replace = $tokens_ref->{$token};
# now i know this looks weired but M$ word (at least 2000) wan
+ts \r
# as the para marker not \r\n or even \n if you send \n you ge
+t little
# binary squares..... oh well that's M$ for you.
$replace =~ s/\r\n|\n/\r/g; # this makes it work properly. GO
+K
$search_obj->{Text} = $find;
$replace_obj->{Text} = $replace;
$search_obj->Execute({Replace => $wdReplaceAll});
}
$doc->Save;
$doc->Close;
# now get the data out of the modified temp file
$content_ref = read_file( "$DOC_DIR/system/$temp_name" );
# remove our unwanted temp files and objects
unlink "$DOC_DIR/system/$temp_name";
undef $search_obj;
undef $replace_obj;
undef $doc;
return $content_ref;
}