in reply to OLE, Excel, and PERL

The code shown will never die here:

$xl_app = CreateObject OLE 'Excel.Application' || die $!;

Your code will never die here. || binds to the constant string 'Excel.Application', not the method call. Here's how perl parses that line (see that there is no 'die' in the parsed code!):

C:\>perl -MO=Deparse,p -MWin32::OLE -e "$xl_app = CreateObject OLE 'Ex +cel.Applic ation' || die $!;" $xl_app = 'OLE'->CreateObject('Excel.Application'); -e syntax OK

Use or in place of ||, or use parens to explicitly show the precedence you want. Now when the code fails, it will die with an appropriate error message.

Note: It would be more idiomatic to write that line the same way perl parses it ( $xl_app = 'OLE'->CreateObject('Excel.Application') ) instead of the function-like way it is written.