Lisp::Fmt - Perl module for Common Lisp like formatting
use Lisp::Fmt; $str = fmt("~{~a ~5,,,'*a~}", $a,$b,$c,$d); # store result in $str pfmt("~{ ~a~5,,,'*a~}", $a,$b,$c,$d); # print to stdout
The Common Lisp "format" function provides an extremely rich set of formatting directives. This module brings this to Perl.
The formatting directives all begin with a ~ and take the form: ~[N]{,N}[@][:]X
~
~[N]{,N}[@][:]X
where N is a number, X is a formatting directive, and @ and : are optional modifiers. Recognized directives are: A, S, W, D, O, B, X, R, C, P, T, ~, %, |, _, ?, *, \n, {, }, (, ), [, ], <, >, ^
N
X
@
:
examples:
C<~A> - simplest format spec, prints the arg C<~D> - prints a number in base 10 C<~X> - prints a number in base 16 C<~12R> - prints a number in base 12 C<~@R> - prints a number in roman numerals C<~#[ none~; ~a~; ~a and ~a~:;~!{~#[~; and~] ~a~^,~}~]."> - prints a list in nice readable english
as a param, a v will read the param from the arglist a # will interpolate to the number of remaining args the directive can be one of: A print the arg S print the arg in a readable form (strings are quotes,...) @ will pad on left params are: mincols (maxcols if <0), colinc, minpad, padchar, overflowchar ~ print a ~ [N ~s] % print a newline [N newlines] | print a formfeed [N formfeeds] _ print a space [N spaces] & print a newline unless already at the beginning of a line T tabulate @ relative params are: colnum, colinc n ignore the newline and any following whitespace : newline is ignored, whitespace is left @ newline is printed, following whitespce is ignored * next arg is ignored, with param, next N args are ignored : back up in arg list, with param, backup N args @ goto 0th arg, or with a param, Nth arg ? indirect - 2 args are a format string and list of args @ - 1 arg - is a format string, use args from current arglist P pluralize @ use y/ies : use previous arg D a number in base 10 O a number in base 8 X a number in base 16 B a number in base 2 R a number in specified radix (ie. ~7R) @ print leading sign : print with commas params are: mincol, padchar, commachar, commawidth, overflowchar without a radix specifier: in english "four" : in english, ordinal "fourth" @ in roman "IV" :@ in old roman "IIII" C a character @ as with write : spell out control chars ( downcase until ~) - hello world @ capitalize the first word - Hello world : capitalize - Hello World :@ uppercase - HELLO WORLD { iteration spec until ~} @ use remaining args : arg is list of sublists :@ use remaining args, which are sublists [ conditional spec, separated with ~; ending with ~] choose item specified by arg ~:; is default item with a param, chhose with it instead of arg @ choose if not false : use first item if false, second otherwise ^ abort ? {} or <> if no args remain, or if a param is given, it is 0 or if 2 params are given, they are equal or if 3 params are given, the 1st is <= 2nd <= 3rd : terminate an entire :{ or :@{, not just this iteration
For a more complete description of the various formatting directives, parameters, etc. see your favorite lisp reference, such as http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3.html.
! is a synonym for @
Often used format strings can be pre-compiled: $f = Fmt::compile("~{ ~a ~5,,,'*a~}"); $str = fmt( $f, ...);
$f = Fmt::compile("~{ ~a ~5,,,'*a~}");
$str = fmt( $f, ...);
when lisp says an arg is a "list", we translate that as a reference to a list (or hash)
lisp: (format () "~{ ~A~}\n" '(a b c d e)) perl: fmt( "~{ ~A~}\n", ["a", "b", "c", "d"]) fmt( "~{ key ~A value ~A\n~}", {foo=>1, bar=>2, baz=>3})
Floating-point output is not yet supported.
the <> formatting support is incomplete.
the radix for ~R is restricted to the range 1-36
no test is performed to detect circular data structures
many other bugs not listed here
none.
see BUGS.
Common Lisp - The Language 2nd. ed. L<http://www.harlequin.com/education/books/HyperSpec/Body/sec_22-3.html> Yellowstone National Park.
Jeff Weisberg - http://www.tcp4me.com/code/
This software is Copyright (c) 1998 Jeff Weisberg Permission is granted to use, copy and distribute this software under the following conditions: - This license covers the original software, as well as modified or derived works. - All modified or derived works must contain this notice unmodified and in its entirety. - This software is not to be used for any purpose which may be considered illegal, immoral, or unethical. - This software is provided as is and without warranty.
To install Lisp::Fmt, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Lisp::Fmt
CPAN shell
perl -MCPAN -e shell install Lisp::Fmt
For more information on module installation, please visit the detailed CPAN module installation guide.