This module has many positive reviews, and it's the standard CSV parsing module, so I'll just add some caveats:
1. Make sure your CSV doesn't have duplicate column names. If it does, row data may move around from one column named X to the other column named the same.
2. It can't ->print hashrefs, so you'll have to convert them to array refs yourself:
This is my favorite way of handling CSV files and CSV inputs for DSLs. It's handled many cases that the other modules I tried couldn't handle. And it's pretty fast too.
This module is really great & always my first choice to read (and write ;-)) any kind of CSV.
It experienced no problems with CSV files from any kind of program - just simply tell the new() method, how the bunch you're about to read looks like, and it works.
Hint: People reading foreign language CSV's should remember to set the "binary" attribute, otherwise you cannot read extended characters.
It reads all kinds of crazy insane CSV variants that crazy insane people throw at my software. Once or twice, when it wouldn't handle one, I complained to the author and he made it work very quickly. This is the place to start for CSV reading.
As a Perl newbie I didn't realize that the XS suffix indicated that this module required access to a working C compiler and make :(. Just a warning to the uninitiated. Otherwise this looks great and I wish I could use it.