The only problem I have with CPAN is its lack of a past. You can't just re-download some module from CPAN you had installed a year ago, because it got removed from CPAN and now it's on BackPAN, so now you have to cobble together some scripts to download all the correct dependencies from BackPAN, and use Perlbrew to get the right perl version + core, and use Pinto to maintain your archive of old modules for the branch/release of your application that it matches. Maybe this is a problem that every language's library repositories have, but it's annoying that there isn't a CPAN standard for "install only the dependencies of module X at the time Module X was released".
The whole thing is still a mess, though. For example, some dists never got put into CPAN at all; they were either one-off releases or were shipped in a Linux distro or a perl core at some time or another and then re-versioned for CPAN. So when you try to find the source via cpanminus, you can't, because it literally doesn't exist. So you can either upgrade or downgrade and face whatever incompatibility that means, or use perlbrew and maintain your entire perl stack for every app you ship. Unfortunately it turns out Pinto has a slew of bugs that require you skip all errors (ick). Let's face it, versioning and releases in Perl modules is a goddamn wilderness.