OK, if I understand correctly, the semicolon would have already been changed to a newline within those few lines of code, right? If the client is a normal web browser, I'd say it's probably a bug in
$srv's package. If not, then the client is most likely failing to encode its data properly before sending it. Either way, if the semicolons are already changed by the first time you see the data, you're not going to be able to change them to pipe characters to prevent it.
If you have control of the client, running a tr/;/|/ over the data ($data =~ tr/;/|/;) before sending it will change the semicolons to pipes as you initially requested, but fixing the encoding and/or your company's package would be the better solution.