Something I figured out recently is that you can dereference an array ref with $#{} to get the index of the last element. An empty array has it's "last element" at -1, so try this:
if ( $#{ $complete->{landmarks}->{LOG}->[$i][$j][$p] } >= 0 )
{
#Whatever
}
Update: While that will fix your issue, it doesn't answer the question you asked in the subject. Hopefully someone can answer that authoritatively, but I'll go out on a limb and say that dereferencing shouldn't make a copy of the array. It should tell the interpreter, "There is an array at the end of this pointer." Then the interpreter says, "Thanks, I'll just use that in scalar context now", which should be just fine.
print pack("A25",pack("V*",map{1919242272+$_}(34481450,-49737472,6228,0,-285028276,6979,-1380265972)))