imlepid has asked for the
wisdom of the Perl Monks concerning the following question:

Hi all--

I am interested in learning Perl. I have been a light Perl user for a long while but it's finally proving itself very useful for my day job (which consists of being a network admin and sys admin for systems which support/monitor the network).

Background: I, many long years ago, bought Programming Perl (Wall et al) 2nd Edition (published in 1996)! I never really did much with it other than flip though it reading a little here and there. In the mean time I have learned other programming languages like C and some Java and worked on one moderate sized (for me) Perl projects and tweaked other's Perl code when needed. I have a basic understanding of Perl. How should I get a solid understanding of Perl to assist in my job? Should I:

1) Read through the 2nd edition of Programming Perl and update my Perl through experience?

2) Read through the 2nd edition then update myself using another book or online tutorial/guide?

3) Purchase the newly released 4th edition of Programming Perl to have the most up-to-date knowledge?

4) Dispense with the dead-tree books and just learn online and on my own through experience?

5) Something not considered above?

My intermediate term goal is to become skilled enough in Perl to quickly create useful scripts to crawl through a network containing hundreds of devices and extract data from those devices. This data will likely be put into a database to be accessed via web interfaces, analyzed to create reports, and trigger alerts. There is no particular time limit; I just want to become more skilled. Given my background, goals, and resources what do you suggest?

Domain-specific experience with CPAN modules for using databases, etc., etc.

For me, 3 was something of a steep learning curve (but one I eventually got over). But 4 is an ongoing journey of discovery! (For example, see my very recent post Re^2: RegEx + vs. {1,}.)

Now, I would definitely recommend that you acquire the latest edition of the Camel Book, but “reading through” is probably not the way to go. Focused reading, targeting any weak areas in the above list, will likely be far more productive.

And don’t neglect other sources of information: Perl documentation, especially the FAQs, comp.lang.perl.misc, and of course PerlMonks! Also don’t be afraid to challenge yourself. I can’t recommend Higher-Order Perl (free online) by Dominus highly enough in this regard.

Your list is interesting, because in my own case, your #2 (idioms, map, grep) came at #5, after everything else. I suppose that's because previous experience with C pointers made references easy, and experience with grep and awk did the same for regular expressions (though I agree that there's always more to learn about those). Also, you just can't do a lot of useful work without regexes, complex data structures, and CPAN.

You can get away without map/grep and other Perlish methods like statement modifiers, though, by using a lot of loops and making your code look like C or some other language. So I tend to think of the idiomatic stuff as the sign that someone's not just capable of programming in Perl, but comfortable with it.

I suppose everyone's list might be a little different, based on their own previous experience.

Athanasius gave you excellent advice. I also suggest that you read Modern Perl by chromatic, it really helped me to develop a more Perlish style of thinking. For me, one of Perl's greatest strength lies in its idioms.

I can only endorse to that. What I think is pretty interesting is that Athanasius emphasizes the usage of idioms. The python fans always emphasize the usage of the "one-and-only-correct-idiom". I have to admit that I think that the allways stated TIMTOWTDI in Perl is a simple fact but not a perfect advice to get a good programmer in Perl.

Start to study code on CPAN where you know that's newer code and it's well rated. You will soon get a feeling for readable code. And you will find repetitions of hopefully good idioms.

I underrated map and grep for a long time. Look at their power.

My last advice: I would have been happy having a good perl programmer as a mentor. I never had the oportunity. Why do I advice this: You need someone experienced who tell you what you have to think about programming for the long term. You have to comprise aspects you don't even know about when starting programming. (That's true not only for Perl.) Don't bother for throw away scripts, but over the time your own code starts to be a bundle of idioms or C&P templates. If you did it wrong you transport wrong approaches all over. Best example for that. You find many Perl documentation where the instantiation is done like

which is not 100% percent correct. When you look at newer questions here in the forum you can find exactly this "wrong" idiom in questions. Why: It's Copy & Paste. That's normal. So, take care that your own C&P templates are as good as possible.

When we are with books: Look at Higher-Order-Perl (http://hop.perl.plover.com/) which is meanwhile for free. I spent money for that years ago and NEVER regret it.

Learning Perl: It sounds to me like you're probably past this point already.

Intermediate Perl: This may be a good choice for you; references, packages, modules, objects, testing, distribution.

Modern Perl: This is a nice book demonstrating a more modern philosophy toward using Perl effectively.

Programming Perl: I had the 2nd and 3rd editions, and wasn't sure the 4th would be worthwhile, but its sections on pattern matching (explaining more recent editions to the Perl RE sub-language), and Unicode have been highly worthwhile for me. It also covers things like security, as well as more modern tools and techniques.

Perl Testing: A Developer's Notebook: Perl has really embraced the testing culture, and while Intermediate Perl and the documentation for Test::More can get you headed in the right direction, this book helps to broaden ones skill-set (and tool set) for testing.

Higher Order Perl: This book is excellent. You probably won't want to run out and write a parser using functional techniques as the first order of business after finishing the book, but it will improve your mastery of "higher order" techniques, and this is almost certain to reflect in your code.

There are a lot of other resources. And my list got longer than I originally intended. There are other books I really like, but didn't include, because this list alone is plenty to help you (along with your own research and practice) to get over the next hump or two, or more. :)

Thanks so much for all your advise and encouragement. I think I'll work on using my 2nd edition of Programming Perl as a jump start and reference while topping up my skills with several of the references mentioned.

I like dead trees, so I went from Learning Perl to The Perl Cookbook to Learning Perl(4th) with a detour through Cross-Platform GUI Programminng with wxWidgets(wxPerl).
I also read most of the Perl Monks posts on a daily basis to broaden my vision of what is out "there". From this I know I need to spend more time with split, join, map, grep, and regexs. Some of that stuff looks like whistling into an acoustic coupler!
I like to learn from reading good code as has already been mentioned.

I am interested in learning Perl. I have been a light Perl user for a long while but it's finally proving itself very useful for my day job (which consists of being a network admin and sys admin for systems which support/monitor the network).

Sounds to me like you're already on the path to Enlightenment.

Rather than add to the comments folks have already made let me just say that there is no better teacher than experience. To learn a skill you need to practice the skill. If you've got a handle on the basics then the more esoteric skills will come with time and practice. If you run into a brick wall then post here in Seekers of Perl Wisdom, show us your code and you'll get a bunch of suggestions on how to get past it. Wear your thick skin though because occasionally you'll get a reply from a troll.

If you're planning on using Perl to mine data from network devices (speaking from experience here) spend some effort learning regexes. Learn the ins and outs of Net::Telnet if that's how you are accessing the network devices.

One strategy as well is to become well versed in creating modules. Since report writing against network data is pretty much the same broken record over and over again this is a very good application for creating "write once; use many" types of modules.

Have fun.. Learning Perl is not a destination. It's a journey. I've been writing in Perl since 1989 or so and I'm still learning.

When improving my coding ability in Perl I have found the following to be useful. (These same ideas have worked with other languages as well.)

Read the book - you have several good recommendations already - but look to answer specific questions. Use it as a research tool. I always use a good old-fashioned book. (I guess that I'm old-fashioned myself.) It is often more helpful to get away from the screen/keyboard/mouse and relax a bit while you look something up. but...

Keep perldoc bookmarked in your browser - there's no better way to quickly find the exact syntax that you want.

Look at other's code; you don't have to do things the way they did, but seeing the way someone else successfully solved a problem will show you possibilities that you never thought of. Perlmonks is one of my favorite sites for this; I have learned a lot here, including new approaches to problems that were big improvements over doing things the way that I had been.

Kyle,
Here's a few books that will help you.
- PERL CD Bookshelf 3.0 (searchable html)
- MySQL and Perl for the Web (Paul DuBois)
Mostly alot of reading CPAN modules, for SNMP/SSH.
I have spent the last 5 years developing tools
you are mentioning in your question. I use mysql
as the backend database, after I found the limits
of flat files w/parallel processes a DB table
was the only way to store data.
How do you move a mountain? Once rock at a time.
Joe

I like the Camel book. Also having a problem and working around it helps a lot. So it may be early now but, as soon as possible, as an exercise, I suggest to directly try to solve your problem and search CPAN for crawl, database, DBI, DBD and other appropriate keywords.

When you figured out which modules best fit for your problem, install them and test as much code as you can (especially from module's examples) trying to gradually approach your solution. Experience will came...