在打印中使用未初始化的值

Dar*_*ick 1 html perl

我在 Web 服务器后面有 Perl 代码,并将该 Perl 脚本与纯 HTML 结合起来。重要的部分如下所示:

#!/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
Run Code Online (Sandbox Code Playgroud)

当有人打开网页时,日志中会出现以下错误消息:

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.
Run Code Online (Sandbox Code Playgroud)

我知道这是因为use warnings;,如果我禁用它,那么日志中不会出现任何内容。print <<ENDHTML;但是,如果我可以忽略从到 的脚本部分,那就太好了,ENDHTML因为它们是 HTML 代码的一部分。有没有办法让这一切发生,我也可以use warnings;

too*_*lic 7

您的此处文档正在字符串中插入变量,因为您使用了ENDHTML没有显式引号的裸露变量。这与使用双引号相同"

如果使用单引号,将避免变量插值,这将消除警告消息。改变:

print <<ENDHTML;
Run Code Online (Sandbox Code Playgroud)

到:

print <<'ENDHTML';
Run Code Online (Sandbox Code Playgroud)

你可以保留use warnings;。请记住,如果您的此处文档确实包含您未显示的变量,它们也不会被插值。

请参阅类似引号的运算符(搜索EOF


sim*_*que 5

这是你的定界符字符串中的美元符号。Perl 认为这些是变量。

<!--                                      XXXX        -->
                <section class="feature 6u$ 12u$(small)">
Run Code Online (Sandbox Code Playgroud)

你需要逃避它们,就像这样:

                <section class="feature 6u\$ 12u\$(small)">
Run Code Online (Sandbox Code Playgroud)

虽然我想知道那是什么类型的 HTML。类名中不能包含美元符号和括号。

更多详细信息$12

Perl 忽略 后面的空格$,因为美元符号在 Perl 语法中不能独立存在,并将12其后面的数字视为变量名。$12将引用正则表达式匹配的第 12 个捕获组。以数字开头的变量名后面不能有字母,所以是$12和 不是$12u