If I remember correctly, "p" is more of a debug tool, it uses the "inspect" method to determine what to output, while "print" (I think just an alias for "pretty_print", uses the standard "to_s" to determine the output.
Both will be usually the same, but "p" will have a different output if "to_s" is overridden in the class.
test = Array.new
p test
print test
class Array
def to_s
"ARRAY"
end
end
p test
print test