我在 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;?
您的此处文档正在字符串中插入变量,因为您使用了ENDHTML没有显式引号的裸露变量。这与使用双引号相同":
如果使用单引号,将避免变量插值,这将消除警告消息。改变:
print <<ENDHTML;
Run Code Online (Sandbox Code Playgroud)
到:
print <<'ENDHTML';
Run Code Online (Sandbox Code Playgroud)
你可以保留use warnings;。请记住,如果您的此处文档确实包含您未显示的变量,它们也不会被插值。
请参阅类似引号的运算符(搜索EOF)
这是你的定界符字符串中的美元符号。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。