Monday, 30 May 2011

Data::Printer - a colored pretty printer for Perl

Wait, stop. Is this Yet Another Data::Dumper?

Well, yes and no. Data::Dumper (and friends) are meant to stringify data structures in a way that makes them still suitable for being eval'ed back in. That's really awesome, but poses a huge constraint over pretty-printers. Earlier this year, brian d foy talked about the amazing powers of Data::Dump, but it still suffers from those constraints. Same goes for the (also great) Data::Dump::Streamer.

Here's a quick visual comparison between the ever popular Data::Dumper and the new Data::Printer:

First thing you'll notice is the colored output, indexed arrays and a little extra regex information. But Data::Printer offers much more than that. How about debugging objects?

And what if your data is attached to others?

The idea behind Data::Printer is that most developers (at least to my experience) use such tools mostly just to see what's going on inside their variables and objects, not to serialize data in and out of Perl. So I decided to make a module that would focus on that: display Perl variables and objects on screen, properly formatted (to be inspected by a human). Data::Printer is somewhat similar to Ruby's "awesome_print", but I made sure to include more customization options and some neat features present in Perl's data dumpers.

For example, I called the printer function "p()" as it's nice and short and should steer clear of name collisions. But if you're so used to calling "Dumper()" in your code it just comes out naturally while you type, you can try this:
  use Data::Printer alias => 'Dumper';

Dumper( %foo ); # there, problem solved!

Data::Printer comes with (I hope!) very sane defaults, so usually all you have to do is "use Data::Printer" (or even shorter: "use DDP") and start peeking at data structures with the exported "p()" function. But pretty is a matter of personal taste, and from colors to array indexes to the hash separator and their default values, you can customize just about anything!

Sounds neat, but I'm not gonna type all that every time!

And you shouldn't - which is why Data::Printer looks for a file called .dataprinter in your home directory and lets you keep all your preferred settings right there, so you only have to worry about it once :-)


There are times when you don't really wish to see an entire object's internals during your review, just that important piece of information that you're holding in it. Data::Printer also offers you the ability to easily add filters to override any kind of data display:

  use Data::Printer filters => {
'DateTime' => sub { $_[0]->ymd },
'HTTP::Request' => sub { $_[0]->uri },

If your filters are too complex you can create them as a separate module and load them by name. You can even upload them to CPAN so others can benefit from it! In fact, Data::Printer already ships with some (hopefully useful) filters for the whole DateTime family of modules (not just DateTime, but also Time::Piece and friends), and some Database ones as well (currently DBI and DBIx::Class):

You can also make your classes Data::Printer-aware simply by adding a _data_printer() function to them. You don't have to add Data::Printer as a dependency at all, and it will use that function to filter your class by default instead of doing a regular dump.

In Short...

If you want to serialize/store/restore Perl data structures, this module will NOT help you, and you should try other solutions such as the Dumper/Dump family, Storable, JSON, or whatever you can find on CPAN.

But if you only care about seeing what's going on inside your data structures and objects, give Data::Printer a try! Oh, and if you're into REPLs, you can add it as your default dumper for Devel::REPL too =)

Code is on github. Comments, feature requests, bug reports and patches are welcome!

Friday, 13 May 2011

The *REAL* Perl Ironmen =)

Last Saturday (May 7) there was a huge Perl event in Brazil - the São Paulo Perl Workshop! It was a full-day conference with several awesome talks, featuring brilliant international keynotes like brian d foy, Brad Fitzpatrick and Larry Wall himself! The workshop also contained some of our local talent like Eden Cardim, Thiago Rondon and Solli Honório, and even talks from W3C and brazilian companies relying on Perl for their core businesses. We had around 100 attendants, making this one of the largest Perl events in the world!

But here's where it really heats up: We were on the Rio Perl Mongers mailing list, calmly discussing how to get to São Paulo for the workshop - you know, renting a bus, getting on the same flight, that sort of thing - when Diogo suggested we use other, less convenient, means of transportation.


Now, for those of you that are unfamiliar with Brazil, here's a little geography lesson. It's the 5th largest country in the world, and although in adjacent States, the distance from Rio to São Paulo is over 480km (298.3 miles), most of it UPHILL. It beats NYC to Washington DC by 150km (93 miles), Tokyo to Kyoto by 110km (68 miles), and London to Paris by over 140km (87 miles)! Of course, being a mailing list of mostly brazilian people, we all knew that already. So when Diogo tossed in the air such an absurd idea, bearing on the clinically insane, there was only one thing we could do.

We said "Hell, yeah!!"

There were 4 of us in total for the adventure: MDA on the "safety car", Marcio, Diogo and myself riding the bikes. Marcio is actually from São Paulo, and would come to Rio by plane with his bike only so he could ride with us!

Plan and Preparations

A friend of mine is actually a professional trainer for a big team here in Rio, and agreed to help us get into shape and plan for the ride - granted, her wording was more in the line of "I'll do my best to help you not die", after a few minutes of screaming about how crazy we were. We only had two weeks(!!) to prepare so we'd need all the help we could get. Thanks coach!

Once we started taking it really serious and got our feet back on the ground, we realized there were some problems with the journey. Thing is, even at an extremely generous 25km/h rate (did I mention most of the way is uphill?) we'd still take over 20 hours straight to reach São Paulo. That's at least two days, and unlikely to happen. Getting the friday off was not that big a deal, but there was little chance we'd all be excused for thursday too. So we decided to cycle from 7am until it got dark, at which point we'd get in the safety car and finish the travel. After all, we had a Workshop to attend ;-)

Surely, nothing can go wrong! Oh, wait...

Marcio missed his flight, and had to travel by bus to Rio overnight. MDA faced a lot of traffic jams and we could only reach Marcio at the bus station by 9am. Then Marcio found out his bike's fork broke during the travel, and we had to find a place to quickly fix or replace it. With all that trouble, it was only 2pm when we finally hit the road!

Marcio had a tiny issue with his bike

On the highway, we started pedaling on the side of the road, and found out the hard way there were a lot of places with no "side of the road" at all! Whenever we found such places we had to get back in the car and wait until it was safe again. It was a nuisance, but no one had a death wish.

that was actually an easy onewarning: side of the road missing

It was really scary to ride next to giant trucks and speeding cars, and to see several pieces of tire torn off from trucks on the way.
you know, kinda like this

At some point we even had to quickly move to the "side of the side of the road" - whatever that means - to avoid being hit by a car traveling against the traffic, on our lane!!


It was a 4 hour ride and, albeit exhausted, we had a lot of fun! It was a nice opportunity to exercise outdoors, see some great sights and even raise awareness of the local IT community to the Workshop and to Perl itself - there was a lot of joking around because "camel" in portuguese is also a slang for bicycles =)

As a reward, we got the chance to be in a great workshop with fellow Perl hackers. Now who knows, maybe this november for the YAPC in Rio we'll travel back from São Paulo ;-)

the cycling team and their reward

Oh, and if you're interested in more pics of the journey and the conference itself, here they are :)