in reply to if not defined

not defined is fine, but not is very low precedence. That is,
if (not defined($pname) && $pname ne ''){
is parsed the same as
if (not (defined($pname) && $pname ne '')){
instead of
if ((not defined($pname)) && $pname ne ''){

Also, if $pname isn't defined, then it can't possibly equal '', so you probably need to change your conditions a bit (probably you mean something like

if (!defined($pname) || $pname eq ''){
but it's possible you want something else.)