in reply to uninitialized value in phonebook program

I noticed two problems in your code. First, the line where you're getting the warning:
$name =~ /(.+)&(.+)/; if ($2 =~ /^0$/) {
You haven't actually verified that the regex matched against $name. I suspect that the regex match is failing, leaving $1 and $2 uninitialized, because $name doesn't hold what you think it does. Make sure the match succeeds before relying on the special variables.

Second, to check the format, you have a while loop inside your foreach loop. If $_ is false, you push 0 onto @info, and then call next. However, this next jumps to the next iteration of the while loop (which would happen anyway), when you want to jump to the next iteration of the foreach loop. You should use a loop label to resolve this problem.