For starters, your my usage is wrong.
my $headline, $body, $url;
means
(my $headline), $body, $url;
but you want
my ($headline, $body, $url);
The solution requiring minial change is,
# publish.pl
sub layout {
local our ($headline, $body, $url) = @_;
do 'article.layout.pl';
}
layout($headline, $body, $url);
# article.layout.pl
our ($headline, $body, $url);
print("$headline, $body, $url\n");
Update: Just to be clear, I recommend against using my solution (and wfsp's). I think you're going to spend way more time avoiding using a real template system than actually switching over. The sooner you switch, the easier and quicker it will be. My solution is a quick fix in case you already have your "templates" written that way and this needs to be done "yesterday". Otherwise, I think switching to a templating system would be faster, even in the short run.