Text Generation in Perl
Introduction
Perl is a good language for generating text, and even its name originally stood for "Practical Extraction and Report Language". This page aims to list some of the facilities provided by Perl and CPAN for generating text.
Text Generation Facilities
String Concatenation
Perl allows you to easily concatenate two strings using the .
and .=
operators. While you can quickly outgrow it, it is often enough. You can also interpolate string values inside some types of string constants. Therefore, you can say:
my $name = "Sophie"; my $city = "London"; my $large_string = "Hello $name, welcome to $city!"; # $large_string is now "Hello Sophie, welcome to London!"
You can also interpolate array elements and hash keys:
my @colors = ("Red", "Orange", "Yellow", "Green", "Indigo", "Blue", "Violet"); my %capitals = ( "France" => "Paris", "Germany" => "Berlin", "Spain" => "Madrid", "Japan" => "Tokyo", ); print "Japan has a flag with a $colors[0] circle, and a its capital is $capitals{Japan}\n";
Furthermore, one can interpolate more complex expressions using the turtle operator - @{[]}
, although if you're resorting to doing it, you should probably use the more advanced techniques below:
#!/usr/bin/perl use strict; use warnings; print "Please enter a number:\n"; my $n = <>; chomp($n); my $string = "$n is @{[($n % 2 == 0) ? 'even' : 'odd' ]}"; print "$string\n";
Perl also gives you a large selection of delimiters for strings as well as here-documents, which allow assigning multiple-line string constants with a user-specified terminating delimiter.
Nevertheless, please read on to see what other and often better options exist.
sprintf()
sprintf() is a built-in Perl function for formatting its arguments, similar to the sprintf function provided by C and other programming languages. Make sure you familiarize yourself with it.
Text-Sprintf-Named
Text-Sprintf-Named allows one to pass an associative array to a sprintf-like function with named conversions. So one can do:
my $formatter = Text::Sprintf::Named->new( {fmt => "Hello %(name)s! Today is %(day)s!"} ); # Returns "Hello Ayeleth! Today is Sunday!" $formatter->format({args => {'name' => "Ayeleth", 'day' => "Sunday"}});
Template Toolkit
Template Toolkit is a sophisticated and powerful templating system for Perl, with many extensions on the CPAN. Also see a presentation that Shlomi Fish gave about Template Toolkit, that explains why one should use a template system and especially Template Toolkit.
Data-Report
A Perl module for preparing reports as text and some other higher-level formats.
Perl6-Form
A module for formatting fixed-width text. You should use it instead of the built-in perlform facility assuming you want something like that.
Text-Table
A CPAN module for outputting text tables.
XML-Writer
A convenient CPAN module for outputting XML.
Generating Text Using Lists
An alternative option to generating text is to create arrays or more complex data structures and serialise them into one large string (although this may be best done using Template Toolkit). Here are some pointers to get you started:
Built-in list processing functions such as map, sort, and grep.
Functions like that are covered in Part 2 of the Perl for Newbies presentation.
List processing CPAN modules such as List::Util, List-MoreUtils and List-UtilsBy.