Yes. File::BOM will do this for you. Not that you should be writing a BOM for UTF-8 (kind of difficult to get confused about the byte order on one byte wide characters), but I expect you are dealing with (broken) MicroSoft apps.
Updated: You should really read the documentation. There are several examples in it of how to do what you appear to be asking for. Here's one:
# Read
open(HANDLE, '<:via(File::BOM)', $filename)
# Write
open(HANDLE, '>:encoding(UTF-8):via(File::BOM)', $filename)
The intelligent reader will judge for himself. Without examining the facts fully and fairly, there is no way of knowing whether vox populi is really vox dei, or merely vox asinorum. — Cyrus H. Gordon