in reply to Dealing with errors in subroutines

There are many ways of doing what you want. Here is the quickest one, assuming that you don't need a return value on success:
sub add_user { if (condition) { return 'Oops'; } else { return 'Argh'; } return undef; } my $Result = &add_user; if ($Result) { print "Something failed: $Result\n"; }
This also works if you need a return value, making things a very little bit more complicated:
sub add_user { if (condition) { return 0,'Oops'; } else { return 0,'Argh'; } return 1; } my ($Result, $ErrorText) = &add_user; if ( ! $Result) { print "Something failed: $Error_Text\n"; }
Here is the multilanguage style which is also good whenever you want a program to parse your result (parsing text error messages is ugly):
sub add_user { if (condition) { return 1; } else { return 2; } return 0; } my $Result = &add_user; if ($Result) { print "Something failed: ".$Texts{'Error_'.$Result}."\n"; }
Finally, there is an OOP approch where you define a package and bless it on a hash where the error message and other things could be stored, but this is way too big for your problem...