Make programming easier by programming your shell.
Perl is a language for people who type. It grew up from the shell to write all kinds of programs, but it still rewards people who don't mind launching programs from the command line.
If you spend your time writing Perl from the command line (whether you write short scripts or full-blown programs), spending a few minutes automating common tasks can save you lots of development time—and even more trouble.
The single most useful shell
trick is the realias
command. Normally creating a persistent alias means adding something to your .bashrc (or equivalent) file, starting a new shell, testing it, and then repeating the process until you get it right. Wouldn't it be nice to be able to edit and test a new alias in a single process?
Edit your .bashrc file and add a single line:
source ~/.aliases
Then create the file ~/.aliases, containing:
alias realias='$EDITOR ~/.aliases; source ~/.aliases'
Tip
If you prefer tcsh
, edit your .cshrc file. Then replace the =
sign with a single space in all of the alias declarations.
Launch a new shell. Type the command realias
and your favorite editor (assuming you have the EDITOR
environment variable set, and if you don't something is weird) will open with your ~/.aliases file. Add a line and save and quit:
alias reperl='perl -de0'
Now type reperl
[2] at the command line:
$reperl
Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or 'h h' for help, or 'man perldebug' for more help. main::(-e:1): 0 DB<1>q
Within a single shell session you've identified a useful command that may be difficult to remember, automated it, and have started to use it productively. Nifty.
What makes a good shell alias for Perl programming? Obviously a command that's difficult to remember, such as the one to put the Perl debugger into pseudo-interactive mode. Another good approach is to alias commands that are lengthy or otherwise difficult to type. One final category is a series of chained commands you find yourself typing often.
Here are a few examples. Change the paths as necessary, of course, but have fun removing a little more of the tedium from your life every time you notice yourself repeating something you could automate away. That's the Perl way.
Suppose you're in the midst of upgrading Perl versions while you still have to maintain an older installation. You might have multiple versions of Perl installed. Instead of typing different paths all the time and instead of relying on tab completion to differentiate between perl5.8.8
and perl5.6.2
and so on, make the names different at the start:
alias newperl='/usr/local/bin/perl5.8.8' alias oldperl='/usr/local/bin/perl5.6.2'
This is especially handy if you have a system Perl installed and don't want to break things by overwriting it.
Suppose that you also must test your code against multiple versions of a module or library. For example, you need to know if your code works against version 4.x and 5.x of a database. Alias away the different library paths:
alias newdbperl='perl -M/home/dev/newlib/' alias olddbperl='perl -M/home/dev/oldlib/'
If you're a rigorous tester, you've likely encountered Devel::Cover
. Though it's easy to use, it takes multiple steps to write a new report. Alias that away!
alias testcover='cover -delete; ./Build testcover; cover'
Suppose that you decide to test the Pugs project (http://www.pugscode.org/) and want to embed both Perl 5 and Parrot. Because Pugs undergoes such rapid development, you might have to run its Makefile.PL several times a week. Why make yourself remember how to configure it with the correct options every time? Alias it!
alias makepugs='PARROT_PATH="/home/chromatic/dev/parrot" \\ PUGS_EMBED="perl 5 parrot" \\ perl Makefile.PL && make'
Sometimes you really need to know the version of a module—especially when you're tracking down a bug across multiple machines or pondering an upgrade. Typing out:
$ perl -MCGI::Application -le 'print CGI::Application->VERSION'
4.03
every time is too much work. Stick a function instead in your .bashrc:
function pmver ( ) { perl -M$1 -le "print $1->VERSION"; }
You can also add more error checking and turn it into an alias:
alias pmver="perl -le '\\$m = shift; eval qq(require \\$m) or die qq(module \\"\\$m\\" is not installed\\\\n); print \\$m->VERSION'"
Either way, run it as pmver
:
$ pmver CGI::Application
4.03
These aliases work on Windows under Cygwin too. Even though it's still Windows on one side and Unix on the other, there's no reason you can't make it work correctly. Here's an alias that translates a Unix path to a Windows path and executes the Windows version of gvim
on the file:
alias gvim='perl -we "exec q{/cygdrive/c/Progra~1/Vim/vim63/gvim.exe}, map { s/^(.*)$/(-f \\$1)?qx{cygpath -aw \\"\\$1\\"}:\\$1/e; chomp; \\$_; } (@ARGV); "'
Launching general Windows programs from bash
requires a similar hack:
alias winrun='exec 'cmd', "/c", ((split '/',$0)[-1], map { s/^(.*)$/(-f $1)?qx{cygpath -w "$1"}:$1/e;chomp;$_; } (@ARGV));'
Get Perl Hacks now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.