There is a point which you need to clarify: is the warning the issue you wish to fix, or is perl invoking the wrong version of xyz? Obviously, the latter is a serious issue since you are getting incorrect behavior. However, if the issue is simply the warning, this is certainly an appropriate time to suppress the warning. Warnings pop-up when you do something that is potentially but not necessarily problematic. In this case, both A and B export a subroutine xyz and you know it, so the warning has served its purpose. In this case, try the code:
use A ;
eval {
no warnings 'redefine';
use B ;
# do stuff which only requires B
}
# do stuff which only requires A
Alternatively, you could modify your import behavior. If A.pm and B.pm are in-house, consider modifying them to use EXPORT_OK in place of EXPORT - see Exporter