The 403 HTTP status code is defined as:
The server understood the request, but is refusing to fulfill it. Authorization will not help and the request SHOULD NOT be repeated. If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information available to the client, the status code 404 (Not Found) can be used instead.
I don't know a lot about SOAP::Lite or WSDL, but the way I would debug this is make dumps (Ethereal is a good tool for that that is available for windows) from the networktraffic generated both by your Java app and your perl app and compare these, The headers and responses sent to the server should tell you something about what is going wrong.