I disagree with the first comment but it's based on biological stuff rather than good perl practice.
An array is an ordered list numerically indexed.
A hash is an
unordered list which is string indexed.
A hash uses far more memory to hold it's data and since you're working with a large file that is loaded into memory, you should be mindful of the unneeded memory usage.
Following or not following Perl's best coding practices is the difference between good Perl programmers and mediocre or poor Perl coders.
I see a lot of the point of the third one, but I don't understand the "$!". What is that?
$! holds the error message returned by the OS. So, in the case of opening a filehandle or directory handle, it will tell you the OS's reason why it failed. You can learn about Perl's special variables by reading the perldocs that come with Perl, specifically:
perldoc perlvar
or online
http://perldoc.perl.org/perlvar.html