in reply to Re: if not defined
in thread if not defined

I'd say the former (resembeling the OP) makes sense:

It's testing for all vars at first if it is defined and then if it also isn't the empty string. This partial results is inverted for $odate and then chained on the same level. The result of that is inverted by the leading "not".

If you ignore the (possible) warnings, when a string function is applied to undef

!(length($pname) && length($policy_ur) && !length($odate))
will yield the same.

That may be what he wants or not.

Your (!defined($pname) && $pname ne '') on the other hand is only true für $pname being "undef", so contains a redundant test.