naChoZ's user image
User since: Jun 12, 2001 at 05:17 UTC
Last here: May 15, 2014 at 18:59 UTC (11 weeks ago)
Experience: 3169
Level: Curate (13)
Writeups: 299
Location:Westbrook, ME, USA
Real Name: Andy Harrison
E-Mail: aharrison→i.used.an.email.address.harvester.so.i.could.send.spam@fbi.gov@←gmail.fend.of.da.spam@ftc.gov
IM: AHward off evil spiritsineye of newtMawing of batine
Image From: somethingawful.com
User's localtime: Jul 30, 2014 at 10:11 EDT
Scratchpad: View
For this user:Search nodes

Monks I know:

Useful nodes:

TVSET

Check out his page on getting the most out of using vim for editing your perl.

You can take a look at my vim configuration in my scratchpad.

While I'm on vim, also check out gmax's post Editing features for advanced users, as well as a couple more nodes on editors in general, [here] and [here]

Aristotle
Lots of good reading at his node.

turnstep
Very useful information here. Especially Important is the Posting FAQ.

PerlMonks Related Information:

Items of Interest:

Important Reference Material:

Perl
Database Stuff
Misc

Perl Idioms Explained

Useful s‎crip‎ts and snippets

Sigs around the monastery I've enjoyed:

crouchingpenguin

----
"Never be afraid to try something new. Remember, amateurs built the ark. Professionals built the Titanic."

licking9Volts

Well, no sig, but that handle makes me laugh.

EvdB

--tidiness is the memory loss of environmental mnemonics

dash2

A massive flamewar beneath your chosen depth has not been shown here

jepri

I didn't believe in evil until I dated it.

Tomte

Hlade's Law:
If you have a difficult task, give it to a lazy person -- they will find an easier way to do it

erikharrison

Light a man a fire, he's warm for a day. Catch a man on fire, and he's warm for the rest of his life. - Terry Pratchet

Jenda

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
-- Rick Osborne

LazerRed

Driver carries > $20 in ammo at all times.

and another quote from him...

Whip me, Beat me, Make me use Y-ModemG.

Petras

Don't worry about people stealing your ideas. If your ideas are any good, you'll have to ram them down people's throats.
-Howard Aiken

stefan k

you begin bashing the string with a +42 regexp of confusion

Obligatory geek code:

-----BEGIN PERL GEEK CODE BLOCK-----
Version: 0.01
P++>++++$c?>---P6-> R+>++++M >++O >++MA >++E--PU->+++BD
C+>++D++$S+++$X->++WP+>+++MO >+PP!n+CO-->-PO >+o
>++G!>+A--OL!Ee---Ev++uB++>+++$uS+++w-- >!m!
------END PERL GEEK CODE BLOCK------
[ decode ]
    

Great Perl Modules

Catalyst
Very slick looking MVC development framework for creating web apps.
Class::DBI
One of the most useful modules to come along. This can save you a tremendous amount of time with your database s‎crip‎ts.
Data::Dumper
I use this all the time while coding. I like turning it into a method available through all of my objects.
DBM::Deep
Very useful when you need to work with extremely large arrays and hashes.
WWW::Mechanize
Makes web s‎crip‎ts super easy.
HTTP::Recorder
Use this in conjunction with WWW::Mechanize and your web s‎crip‎ts will almost create themselves.

Useful tips.

Perlmonks
Collapsable Nodelets

Stuff this javas‎crip‎t somewhere in your Free Nodelet somewhere. I know it's crap. It's the first javas‎crip‎t I wrote from scratch, but it works.

function nodeletExpandCollapse () { var bodyId = arguments[0]; var showCustom = arguments[1]; var hideCustom = arguments[2]; var whichcustom = document.getElementById(bodyId); if (whichcustom.className==showCustom) { whichcustom.className=hideCustom; } else { whichcustom.className=showCustom; } } function nodeletObject ( text, headId, bodyId, defaultState ) { this.text = text; this.headId = headId; this.bodyId = bodyId; this.defaultState = defaultState; } function replaceNodeletHeadings () { var cpan = new nodeletObject( 'CPAN nodelet', 'nodelet_head_ro +w_CPAN_nodelet', 'nodelet_body_row_CPAN_nodelet', 'hide' ); var chat = new nodeletObject( 'Chatterbox', 'nodelet_head_ro +w_Chatterbox', 'nodelet_body_row_Chatterbox', 'hide' ); var vote = new nodeletObject( 'Voting Booth', 'nodelet_head_ro +w_Voting_Booth', 'nodelet_body_row_Voting_Booth', 'hide' ); var info = new nodeletObject( 'Information', 'nodelet_head_ro +w_Information', 'nodelet_body_row_Information', 'hide' ); var pers = new nodeletObject( 'Personal Nodelet', 'nodelet_head_ro +w_Personal_Nodelet', 'nodelet_body_row_Personal_Nodelet', 'hide' ); var free = new nodeletObject( 'Free Nodelet', 'nodelet_head_ro +w_Free_Nodelet', 'nodelet_body_row_Free_Nodelet', 'show' ); var myxp = new nodeletObject( 'XP Nodelet', 'nodelet_head_ro +w_XP_Nodelet', 'nodelet_body_row_XP_Nodelet', 'show' ); var time = new nodeletObject( 'Tick tock', 'nodelet_head_ro +w_Tick_tock', 'nodelet_body_row_Tick_tock', 'show' ); var nodeList = new Array( cpan, chat, vote, info, pers, free, myxp +, time ); for ( var index in nodeList ) { var nodeletObj = document.getElementById( nodeList[ind +ex].headId ); //+ "\n<a href=\"javas‎crip‎t:nodeletExpand +Collapse('" + nodeletTargetIdList[index] + "', 'nodelet_body_row', 'h +ideblock')\" onMouseOver=\"ExpandOnly('" + nodeletTargetIdList[index] + + "', 'nodelet_body_row')\">" var newInnerHTML = "\n<th class=\"nodehead\">\n" + "\n<a href=\"javas‎crip‎t:nodeletExpand +Collapse('" + nodeList[index].bodyId + "', 'nodelet_body_row', 'hideb +lock')\">" + nodeList[index].text + "</a>\n" + "\n</th>\n"; nodeletObj.innerHTML = newInnerHTML; if ( nodeList[index].defaultState == 'hide' ) { nodeletExpandCollapse(nodeList[index].bodyId, "nodelet_bod +y_row", "hideblock"); } } } function init(){ replaceNodeletHeadings(); } window.onload=init;

CLI
perl -lane

Use the -a command-line option to make perl behave like awk. Instead of using $1, $2, etc like awk uses, perl uses the @F array.

Useful usage:

Of all the editors in the FreeBSD ports tree, show which ones you have installed:
/usr/ports/Tools/s‎crip‎ts/portsearch -p editors | grep Port: | perl \ -lane 'print $F[1] if qx(pkg_info -E $F[1])'
FreeBSD - Show bsdpan-* ports with no ORIGIN field. (one liner)

ls -1 /var/db/pkg/bsdpan-*/+CONTENTS | perl \ -ne 'while (<>) { my $filename = $_; \ open( CUR, "<" . $filename); my $origin_p; \ for (<CUR>) { $origin_p++ if m/ORIGIN/; } \ print $filename unless $origin_p}'

Misc
Viewing the code in a perlmonks posting

Here's a little trick I often use when viewing someone's code from a perlmonks node, usually when the coding style is bad or just difficult for me to read, to tidy it up and look at it in vim (or gvim) so I get syntax highlighting also.

Right-click on the little [download] link and copy the url. Then, pass it to wget by pasting it with quotes:

wget -O - "http://perlmonks.org/?abspart=1;displaytype=displaycode;nod +e_id=663850;part=1" | perltidy | view "+set filetype=perl" -
Unrecognized character \xE2 at /home/forda/bin/send_to_mms line 6.

Back in this thread, I responded to someone getting the above error message when copying and pasting code from a perldoc to use in a s‎crip‎t.

I'd run into it before and after spending at least 45 full seconds looking at the perldoc manpage and the Pod:: module docs, I posted the tiny perl s‎crip‎t I originally used to fix this annoying problem myself.

I later updated that s‎crip‎t to make it a little smarter plus added a convenient way to identify the "wide" characters like the curled quotation mark. This is the result:

#!/usr/bin/perl -n #use strict; #use warnings; use charnames (); use encoding "utf8"; $|++; my $chars = { 'HYPHEN' => '-', # \x{2010} 'SOFT HYPHEN' => '-', #­ \x{00AD} 'MINUS SIGN' => '-', # \x{2212} 'FIGURE DASH' => '-', # \x{2012} 'ACUTE ACCENT' => "'", # \x{00B4} 'GRAVE ACCENT' => "'", # \x{0060} 'LEFT SINGLE QUOTATION MARK' => "'", # \x{2018} 'RIGHT SINGLE QUOTATION MARK' => "'", # \x{2019} 'LEFT DOUBLE QUOTATION MARK' => '"', # \x{201C} 'RIGHT DOUBLE QUOTATION MARK' => '"', # \x{201D} 'BOX DRAWINGS LIGHT VERTICAL' => '|', # \x{2502} 'MULTIPLICATION SIGN' => '*', # \x{00D7} }; # If the first character is an equal sign, skip it and # display the identity of each remaining character. # if (/^=/) { chomp; for my $index ( 1 .. length($_) - 1 ) { my $char = substr( $_, $index++, 1 ); print $char . " " . sprintf( "\\x{%04X}", ord($char) ) . "\" = '" . charnames::viacode( ord($char) ) . "'\n" ; } } else { for my $cname ( keys %$chars ) { my $char = chr( charnames::vianame($cname) ); s/$char/$chars->{$cname}/g; } print; }

I gathered the list of characters I defined simply by browsing some random perldocs and man pages, at least ones I thought most likely to contain odd characters that I might want to translate after a copy and paste action. If you have any more suggestions, please let me know.

pmlocate My::Foo

You can set up the same functionality for perl modules as the common locate command available in most Unices.

First, put the pmdesc s‎crip‎t on your system.

Second, add a line to your crontab, usually right alongside the entry for updating the regular locatedb.

20 4 * * *  /usr/local/bin/pmdesc.pl | /usr/libexec/locate.mklocatedb > /var/db/pmlocatedb 2>&1

Now just create a little wrapper s‎crip‎t.

/usr/local/bin/pmlocate: #!/bin/sh # change path if needed LOCATE="locate" LOCATEDB_PATH="/var/db/pmlocatedb" $LOCATE -d $LOCATEDB_PATH $1
Commandline completion for perldoc

You can set up automatic commandline completion so that when you type perldoc perl<TAB> it will autocomplete based on pod documents starting with 'perl', for example.

Create this little s‎crip‎t to generate the list of pods. You could put this in crontab or simply run it on occasion. It would really only need to be updated after installing perl modules. This s‎crip‎t leaves a lot to be desired and I'm sure there's a better way of generating this list, especially one that uses the perldoc command itself, but this way is much, much faster than I found when I tried to use the perldoc command to look for valid perldoc in files.

/usr/local/bin/podlist.sh #!/bin/sh PODLIST=/tmp/podlist.txt PERLPATHS="/usr/perl5 /usr/lib/perl5 /usr/local/perl5 /usr/local/lib/p +erl5" [ -f ${PODLIST} ] && [ ! -w ${PODLIST} ] && echo "Permission problem on ${PODLIST}" && exit 1 [ -f ${PODLIST} ] && rm ${PODLIST} for DIR in ${PERLPATHS} ; do if [ -d "${DIR}" ] ; then FINDPATH=${DIR} break fi done find ${FINDPATH} -type f -name '*.pod' -o -name '*.pm' | xargs egrep -h -A3 '^=head.*NAME' | egrep -v '^X<' | egrep -v '=head' | egrep -v -- '--' | sort -u | dos2unix | egrep -v '^$' | egrep ' - ' | awk -F' - ' '{print $1}' | tr -d '^ ' | sed 's/^README[.]/perl/' \ > ${PODLIST} echo "${PODLIST} generation complete..."

For tcsh commandline completion, add this to your .tcshrc file:

if ( -f /tmp/podlist.txt ) then set podcomplete = ( 'n@*@`\cat /tmp/podlist.txt`@' ) else foreach d ( /usr/perl5 /usr/lib/perl5 /usr/local/perl5 /usr/lo +cal/lib/perl5 /mc/apps/perl/lib ) if ( -d "$d" ) then set podcomplete=( 'n@*@`\ls -1 '$d'/5.*/pod | sed s%\\ +.pod.\*\$%%`@' ) break endif end if ( -z "$podcomplete" ) then set podcomplete=( 'n@*@`\ls -1 /usr/lib/perl5/5.*/pod | se +d s%\\.pod.\*\$%%`@' ) endif endif complete perldoc "${podcomplete}"

I don't know how to do bash completions, but if anyone wants to submit it to me, I'll include it here.

Personal stuff:

Married, three chirruns, two dogs, house in the country.

Long time systems engineer doing broadband ISP work.

aharrison→← & gmail com
ω ∅ ⊃ ° 3 ⊥ ! § d ⊥ ⊥ Η @ λ ρ υ ∀
AHinMaine
$Id: perlmonkbio.html,v 1.29 2012/01/11 03:46:08 aharrison Exp aharrison $
uploaded with hup.pl