steveh44 has asked for the wisdom of the Perl Monks concerning the following question:

I am learning perl (newbie). I noticed when I make a HERE DOCUMENT inside a sub, and print it in the main when the sub returns, it contains an extra blank line at the end. I need a way to get rid of this extra line and understand why it gets added. Here is an example

#!/usr/bin/perl -w use strict; use warnings; sub foo{ my $code = shift; <<"END_MSG"; Add the code $code END_MSG } my $code=<<'END_MSG'; line 1 line2 END_MSG print "before calling\n"; print $code; print "after calling\n"; print foo($code); print "why blank line above?\n";

When I run the above using perl t.pl, I get this output on the screen

perl t2.pl before calling line 1 line2 after calling Add the code line 1 line2 why blank line above?

Any idea what I am doing wrong?

perl>perl -v This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-li +nux-gnu-thread-multi (with 41 registered patches, see perl -V for more detail)

Replies are listed 'Best First'.
Re: how to prevent new line added in HERE document
by morgon (Priest) on Jun 02, 2016 at 23:08 UTC
    You effectivly embed your here-document into another here-document with results in an extra newline.

    Take this code:

    #!/usr/bin/perl -w use strict; use warnings; my $code=<<"END_MSG"; line 1 line2 END_MSG sub foo{ return $code; } print "before calling\n"; print $code; print "after calling\n"; print foo();
    When you run this you'll see there is no extra newline - so calling a sub does not magically add one.

    But what you do is to embed the $code argument in yet another here-document which is where your extra-newline comes from.

Re: how to prevent new line added in HERE document
by GrandFather (Saint) on Jun 02, 2016 at 23:02 UTC

    First some house keeping: excellent to see you using strictures, however -w in the shebang line isn't needed because you are using use warnings. Actually -w has global effect (it applies to code outside the current file) whereas use warnings only applies to the current file and is preferred.

    Next item of house keeping: use indentation to show structure. The code in your sub should be indented.

    Final house keeping hint: make returned values explicit. return <<"END_MSG"; instead of <<"END_MSG";.

    To figure out where white space is it helps to add "quote" characters. Try:

    #!/usr/bin/perl use strict; use warnings; sub foo { my $code = shift; return <<"END_MSG"; Add the code <$code> END_MSG } my $code = <<'END_MSG'; line 1 line2 END_MSG print "before calling\n"; print $code; print "after calling\n"; print foo($code); print "why blank line above?\n";

    and you will see that the contents of $code already has a trailing newline so nesting it in another HEREDOC adds the second unwanted newline. One fix is to chomp $code in the sub:

    sub foo { my $code = shift; chomp $code; return <<"END_MSG"; Add the code $code END_MSG }
    Premature optimization is the root of all job security
Re: how to prevent new line added in HERE document
by LanX (Saint) on Jun 02, 2016 at 22:53 UTC
    That's intended behavior, nothing wrong.

    Two possibilities:

    • chomp the value you return
    • avoid here docs and use qq with a "save" delimiter like ~

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

Re: how to prevent new line added in HERE document
by Cristoforo (Curate) on Jun 02, 2016 at 22:59 UTC
    As LanX says, you could just chomp the parameter passed to sub foo.

    chomp(my $code = shift);