One thing I see in your code is that you're not checking the return value of close. I wrote about the topic of running external commands at length here. From the several possibilities listed there, in this case I might suggest you try IPC::Run3 first, because it seems to work well on Windows. One thing to keep in mind is whether pdftotxt.exe is always going to be in your PATH environment variable, and if not, you should use absolute pathnames (using a suitable module for handling those, like File::Spec or Path::Class). Also, I am guessing that this program may have the ability to write its output to a file, in which case you might just want to have it do that, using File::Temp to generate suitable temp files, and then reading the file back in.