Day 2: The beauty of formatting

by

Unwrapping the second gift brought to you by Perl 6 this Advent, we find… a method named .fmt.

If you’re familiar with sprintf, you’ll feel right at home with .fmt. If you haven’t heard about sprintf before, or if you’ve heard of it but are a bit fuzzy on the details, you might want to skim the perldoc page. Don’t drown in it, though; it’s longish. Just savour it.

Back to .fmt, sprintf‘s spunky little sister. Here are a few ways to use .fmt to format strings and integers.

  say 42.fmt('%+d')                # '+42'
  say 42.fmt('%4d')                # '  42'
  say 42.fmt('%04d')               # '0042'
  say :16<1337f00d>.fmt('%X')      # '1337F00D'

All this is good and well, but not really more than a shorter method form of sprintf. Big deal, right?

What I haven’t told you yet is that .fmt is overloaded, and works differently on arrays (or more precisely, lists):

  say <huey dewey louie>.fmt       # 'huey dewey louie'
  say <10 11 12>.fmt('%x')         # 'a b c'
  say <1 2 3>.fmt('%02d', '; ')    # '01; 02; 03'

Similarly, it’s overridden on hashes (or rather, mappings):

  say { foo => 1, bar => 2 }.fmt   # 'foo     1
                                   #  bar     2'
  say { Apples => 5, Oranges => 10 }.fmt('%s cost %d euros')
                                   # 'Apples cost 5 euros
                                   #  Oranges cost 10 euros'
  say { huey => 1, dewey => 2, louie => 3 }.fmt('%s', ' -- ')
                                   # 'huey -- dewey -- louie'

The way hashing works may give your output a different order than the ones shown above. Oh, and there’s an overloaded .fmt for pairs as well, but it works analogously to the one for hashes.

.fmt is a useful little tool to have when you want to change some value, or an array or a hash of values, into to some given format. It’s like sprintf, but tailored to Do What You Mean for arrays and hashes, too.

There’s only one risk in all of this: Perl 6 might soil the reputation of the Perl family of languages by simply being too darn readable. In order to counter this risk, I leave a small parting gift in the form of a simple-but-dense Christmas tree printing Perl 6 one liner:

  $ perl6 -e 'say " "x 9-$_,"#"x$_*2-1 for 0..9,2 xx 3'

          #
         ###
        #####
       #######
      #########
     ###########
    #############
   ###############
  #################
         ###
         ###
         ###
[*] If you are using Windows, remember you need to switch the quotes around
c:\>perl6.exe -e "say ' 'x 9-$_,'#'x$_*2-1 for 0..9,2 xx 3"
About these ads

Tags: ,

9 Responses to “Day 2: The beauty of formatting”

  1. Will Says:

    Excellent article!!

    Is there any way to have fmt produce “huey, dewey, and loiue” from ?

    Seems like that one is needed alot too.

  2. Ogla Sungutay Says:

    Great article indeed. What a good resource initiative for Perl 6. Keep it up!

  3. carl Says:

    Aloha, Will! There’s no built-in way to do what you want, but one can easly write a custom .fmt method that has a different last separator: I wrote one here just to make sure it works.

  4. Perl 6 Advent Calendar - День 2: Красота Форматирования | Ky6uk's Blog Says:

    [...] перевод на русский язык второй статьи (Day 2: The beauty of formatting) цикла Perl 6 Advent Calendar. Статья посвящена форматированию в [...]

  5. Perl 6 Advent Calendar на русском | Ky6uk's Blog Says:

    [...] рассказано об установке Rakudo, использованию циклов, операторах форматирования, статических типах, мета-операторах и приемах [...]

  6. 扶凯 » [Perl6]美丽的格式化输出 Says:

    [...] 注:很可惜好象目前最新的 Rakudo 是没法执行这个小临别礼物。 本文为译文 By carl: http://perl6advent.wordpress.com/2009/12/02/day-2-the-beauty-of-formatting/ [...]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


Follow

Get every new post delivered to your Inbox.

Join 37 other followers

%d bloggers like this: