Hacker News new | past | comments | ask | show | jobs | submit login

This fails to mention the most useful part of the "baby cart":

  "Greetings @{[ get_planet() ]}lings, we come in peace!"
Evaluating functions directly inside of a string. It's sort of alluded to with "@{[ keys %hash ]}", but in doesn't come right out and say it.



You get the wrong context when you do that. Try it with, say, localtime and see what happens. String interpolation is more obvious, and only one character more in normal formatting, one character less in golf:

    "Greetings " . get_planet() . "lings, we come in peace!"
As it says, the whole point of the baby cart is to force list interpolation. If you don't specifically want that, don't do it.


    "Greetings ${\ get_planet() }lings, we come in peace!"
will give you scalar context as well. My http://shadow.cat/blog/matt-s-trout/madness-with-methods write-up covers some other uses of ${\}


Depends on what you're doing. In a small string, there isn't much difference. It's more useful when doing other things:

  my $message = <<"HEREDOC";
  Greetings @{[ get_planet() ]}lings,

  We come in peace.
  
  Sincerely,
  Your New @{[ get_invaders() ]} Overlords
  HEREDOC
Sure you can jam them into variables first, or use sprintf, but it's a matter of preference so long as you know what you're doing.


You can also use http://search.cpan.org/dist/Interpolation/lib/Interpolation.... for this problem. But if you've got a lot of text, I prefer to bite the bullet and graduate to a proper templating system.

However my point still stands. You need to be aware that it does not simply interpolate the function output in, it also switches you from scalar to list context. (IMO context is the worst idea in Perl, but it is here to stay so you need to know about it.)




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: