1

I have Perl code behind a web server, and I combined that Perl script with pure HTML. The important part looks like this:

#!/usr/local/bin/perl

use strict;
use warnings;

print "Content-type: text/html\n\n";
print <<ENDHTML;
<!DOCTYPE html>
<html lang="hu">
        <head>
    ...
        </head>
        <body class="landing">
        ...
                <section class="feature 6u$ 12u$(small)">
                <h3 class="title">some title</h3>
        <p>some text</p>
        </section>
        ...
    </body>
    </html>
ENDHTML

When somebody opens the web page, this error message will appear in logs:

2022/06/27 13:28:44 [error] 7811#100158: *106 FastCGI sent in stderr: "Use of uninitialized value $12 in concatenation (.) or string at /path/to/file/index.pl line 78.

I know this is because of use warnings;, and if I disable it, then nothing will appear in the log. But, it would be nice if I could ignore the part of script from print <<ENDHTML; to ENDHTML because they are part of the HTML code. Is there a way to make this happen and I can also use warnings;?

toolic
  • 57,801
  • 17
  • 75
  • 117
Darwick
  • 357
  • 3
  • 14

2 Answers2

7

Your here-doc is interpolating variables within the string because you used a bare ENDHTML without explicit quotes. This is the same as using double quotes: ".

If you use single quotes, you will avoid variable interpolation, and this will eliminate the warning message. Change:

print <<ENDHTML;

to:

print <<'ENDHTML';

You can retain use warnings;. Keep in mind that if your here-doc does have variables which you haven't shown, they will not be interpolated either.

Refer to quote-like operators (search for EOF)

toolic
  • 57,801
  • 17
  • 75
  • 117
5

It's the dollar signs in your heredoc string. Perl thinks these are variables.

<!--                                      XXXX        -->
                <section class="feature 6u$ 12u$(small)">

You need to escape them, like this:

                <section class="feature 6u\$ 12u\$(small)">

Although I wonder what kind of HTML that is. You can't have dollar signs and parentheses as part of class names.

More details on $12:

Perl ignores the space after the $, because a dollar sign can't stand on its own in Perl syntax, and treats the numbers 12 after it as a variable name. $12 would refer to the 12th capture group of a regular expression match. Variable names that start with numbers cannot have letters afterwards, so it's $12 and not $12u.

simbabque
  • 53,749
  • 8
  • 73
  • 136