I often forget about Perl's reporting formats, and I suspect that a lot of people do - we're so used to Perl as a programming language that we forget it's original namesake: Practical Extraction and Report Language. Reporting was a big part of Perl's beginnings, but it's hardly ever mentioned today.
In fact, it's been so long since I have used any of these features that I had to drag out my big Camel Book to review the whole subject - I had forgotten everything. Fortunately, it's not hard, and using these capabilities can make output much easier: you don't have to keep track of lines printed so that you can generate headers on new pages or print page numbers: Perl does that for you. You can justify and center, easily handle variable width data and more. Perl Report Formats make all this easy.
Here's an example using a format suggested in the Camel book (or online at Perl Formats)
:#!/usr/bin/perl # a report on the /etc/passwd file format STDOUT_TOP = Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ . format STDOUT = @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<< $name, $login, $office,$uid,$gid, $home . $= = 20; # sets 20 lines per page while (<>) { ( $name, $login, $office,$uid,$gid, $home) =split /:/; next if not $login; write; }
On my Mac, running that program with /etc/passwd as its argument produces this:
Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ nobody * -2 -2 Unpri /var/empty root * 0 0 Syste /var/root daemon * 1 1 Syste /var/root _uucp * 4 4 Unix /var/spool/uucp _lp * 26 26 Print /var/spool/cups _postfix * 27 27 Postf /var/spool/postfix _mcxalr * 54 54 MCX A /var/empty _pcastagent * 55 55 Podca /var/pcast/agent _pcastserver * 56 56 Podca /var/pcast/server _serialnumberd * 58 58 Seria /var/empty _devdocs * 59 59 Devel /var/empty _sandbox * 60 60 Seatb /var/empty _mdnsresponder * 65 65 mDNSR /var/empty _ard * 67 67 Apple /var/empty _www * 70 70 World /Library/WebServer _eppc * 71 71 Apple /var/empty _cvs * 72 72 CVS S /var/empty _svn * 73 73 SVN S /var/empty _mysql * 74 74 MySQL /var/empty _sshd * 75 75 sshd /var/empty _qtss * 76 76 Quick /var/empty _cyrus * 77 6 Cyrus /var/imap _mailman * 78 78 Mailm /var/empty _appserver * 79 79 Appli /var/empty _clamav * 82 82 ClamA /var/virusmails _amavisd * 83 83 AMaVi /var/virusmails _jabber * 84 84 Jabbe /var/empty _xgridcontroller * 85 85 Xgrid /var/xgrid/control _xgridagent * 86 86 Xgrid /var/xgrid/agent _appowner * 87 87 Appli /var/empty _windowserver * 88 88 Windo /var/empty _spotlight * 89 89 Spotl /var/empty _tokend * 91 91 Token /var/empty _securityagent * 92 92 Secur /var/empty _calendar * 93 93 Calen /var/empty _teamsserver * 94 94 Teams /var/teamsserver _update_sharing * 95 -2 Updat /var/empty ^L Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ _installer * 96 -2 Insta /var/empty _atsserver * 97 97 ATS S /var/empty _unknown * 99 99 Unkno /var/empty
Ever had to handle variable length data in a report? That can be annoying, can't it? Let's say we have this text file:
02/04/2008:No changes 02/08/2008:Maintenance 02/16/2008:Major problems. Disk crash, all work lost 02/17/2008:Starting over 02/19/2008:This is just too much work. The project is not worth the trouble. I quit. 02/25/2008:Wow! Big raise. Guess I don't quit.
Here's a little Perl script that eats that up:
#!/usr/bin/perl format STDOUT = Date Action @<<<<<<<< ^<<<<<<<<<<<<<<<<<<<< $date $action ~ ^<<<<<<<<<<<<<<<<<<<< $action ~ ^<<<<<<<<<<<<<<<<<... $action . while (<>) { ($date,$action)=split /:/; write; }
If we run that against our data file, we'll get:
02/04/200 No changes 02/08/200 Maintenance 02/16/200 Major problems. Disk crash, all work lost 02/17/200 Starting over 02/19/200 This is just too much work. The project is not worth the... 02/25/200 Wow! Big raise. Guess I don't quit.
There's a lot more to this, I just wanted to give you a taste here. You can read the docs and play with it yourself but can probably easily see how much time and trouble this could save you.
Got something to add? Send me email.
More Articles by Anthony Lawrence © 2012-07-14 Anthony Lawrence
One in a million is next Tuesday. (Gordon Letwin)
Printer Friendly Version
Perl Reporting Copyright © March 2008 Tony Lawrence
Have you tried Searching this site?
This is a Unix/Linux resource website. It contains technical articles about Unix, Linux and general computing related subjects, opinion, news, help files, how-to's, tutorials and more.
Contact us
Printer Friendly Version