Perl CGI编程(实战指南)

Perl CGI编程入门:从零开始构建动态网页

你有没有想过,网页不只是静态的文字和图片?当你在网站上提交一个表单、点击一个按钮,背后其实有一整套逻辑在“跑”。这种动态交互,就是通过服务器端脚本实现的。而 Perl CGI编程,正是这一领域里的一位“老将”——它诞生于 1990 年代,是最早支持网页动态内容的方案之一。

尽管如今 Node.js、Python Flask、PHP 等技术更受欢迎,但 Perl CGI编程依然值得学习。它结构清晰、语法直接,特别适合初学者理解“网页如何与服务器对话”。今天我们就来手把手带你走进 Perl CGI编程的世界。


什么是 CGI?为什么需要它?

CGI 全称是 Common Gateway Interface,中文叫“通用网关接口”。你可以把它想象成一个“邮差”——浏览器把用户输入的信息(比如表单数据)通过 HTTP 协议“寄”给服务器,CGI 就是那个负责接收、处理、再“回信”给浏览器的邮差。

在没有 CGI 之前,网页只能是静态的。比如你打开一个 HTML 页面,内容永远不变。而有了 CGI,服务器就能根据用户行为动态生成内容,比如显示“欢迎回来,张三!”或“您提交的订单已处理”。

Perl 是最早支持 CGI 的语言之一。它的正则表达式能力强大,处理文本数据非常高效,因此在早期网页开发中占据主导地位。


环境准备:让你的服务器支持 Perl CGI

要运行 Perl CGI程序,你需要一个支持 CGI 的 Web 服务器。Apache 是最常见也是最推荐的选择。

安装 Apache 与 Perl

在 Linux(如 Ubuntu)上,可以通过以下命令安装:

sudo apt update
sudo apt install apache2 perl libapache2-mod-perl2

安装完成后,启动 Apache 服务:

sudo systemctl start apache2

确认服务运行状态:

sudo systemctl status apache2

配置 CGI 目录

Apache 默认的 CGI 目录是 /usr/lib/cgi-bin。你需要确保该目录存在,并且有执行权限。

sudo mkdir -p /usr/lib/cgi-bin
sudo chmod 755 /usr/lib/cgi-bin

将你的 Perl CGI 脚本放入该目录,例如命名为 hello.pl


第一个 CGI 脚本:Hello World

我们来写一个最简单的 CGI 脚本,它会输出“Hello, World!”。

#!/usr/bin/perl

use strict;        # 启用严格模式,强制变量声明,避免常见错误
use warnings;      # 启用警告,帮助发现潜在问题

print "Content-type: text/html\n\n";

print "<html>";
print "<head><title>第一个 CGI 程序</title></head>";
print "<body>";
print "<h1>欢迎来到 Perl CGI编程世界!</h1>";
print "<p>这是你的第一个动态网页。</p>";
print "</body>";
print "</html>";

代码逐行详解

  • #!/usr/bin/perl:这是“shebang”行,指定脚本运行时使用的解释器。
  • use strict; use warnings;:建议始终加上,有助于写出更安全的代码。
  • print "Content-type: text/html\n\n";:这是 CGI 的关键!必须输出这一行,表示返回的是 HTML 内容。注意结尾有两个换行符 \n\n,这是 HTTP 协议的要求。
  • 后续的 print 语句输出 HTML 内容,被浏览器解析后显示在页面上。

设置权限并测试

将脚本保存为 /usr/lib/cgi-bin/hello.pl,并赋予可执行权限:

sudo chmod +x /usr/lib/cgi-bin/hello.pl

然后在浏览器中访问:

http://localhost/cgi-bin/hello.pl

你应该能看到“欢迎来到 Perl CGI编程世界!”的页面。


处理用户表单输入:GET 与 POST

CGI 最强大的地方在于能接收用户输入。最常见的形式是通过 HTML 表单。

创建 HTML 表单

<!DOCTYPE html>
<html>
<head>
  <title>用户信息提交</title>
</head>
<body>
  <h2>请输入您的姓名</h2>
  <form action="/cgi-bin/greet.pl" method="GET">
    <label>姓名:</label>
    <input type="text" name="username" required>
    <br><br>
    <input type="submit" value="提交">
  </form>
</body>
</html>

这个表单使用 GET 方法,数据会以 URL 参数的形式发送,例如:

http://localhost/cgi-bin/greet.pl?username=小明

处理 GET 请求的 Perl 脚本

#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);  # 引入 CGI 模块,简化表单数据获取

print "Content-type: text/html\n\n";

my $name = param('username') || '游客';  # 如果没有传 name,设为默认值

print "<html>";
print "<head><title>欢迎页面</title></head>";
print "<body>";
print "<h1>你好,$name!</h1>";
print "<p>感谢你访问我们的网站。</p>";
print "<a href='javascript:history.back()'>返回</a>";
print "</body>";
print "</html>";

关键点说明

  • use CGI qw(:standard);:引入 CGI 模块,它提供了 param() 函数来获取表单数据。
  • param('username'):获取名为 username 的参数值。
  • || '游客':如果用户没输入,用默认值“游客”代替,避免空值。
  • javascript:history.back():提供一个“返回”按钮,用户体验更友好。

使用 POST 方法处理敏感数据

POST 方法更适合提交密码、邮箱等敏感信息,因为数据不会显示在 URL 中。

修改 HTML 表单为 POST

<form action="/cgi-bin/greet.pl" method="POST">
  <label>姓名:</label>
  <input type="text" name="username" required>
  <br><br>
  <input type="submit" value="提交">
</form>

对应的 Perl 脚本无需修改,CGI 模块自动处理 POST 和 GET

#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);

print "Content-type: text/html\n\n";

my $name = param('username') || '游客';

print "<html>";
print "<head><title>欢迎页面</title></head>";
print "<body>";
print "<h1>你好,$name!</h1>";
print "<p>你使用的是 POST 方法提交的数据。</p>";
print "<a href='javascript:history.back()'>返回</a>";
print "</body>";
print "</html>";

安全提示:避免常见陷阱

虽然 Perl CGI编程简单,但安全不容忽视。

1. 输入验证

永远不要相信用户输入。即使表单有 required,服务器端也必须验证。

my $name = param('username');
if (length($name) < 2) {
    print "<p>姓名至少需要 2 个字符。</p>";
    exit;
}

2. 防止 XSS 攻击(跨站脚本)

如果用户输入包含 <script>,浏览器会执行它,非常危险。使用 escapeHTML 函数转义:

use CGI qw(:standard escapeHTML);

my $safe_name = escapeHTML(param('username'));
print "<h1>你好,$safe_name!</h1>";

3. 不要直接执行系统命令

避免使用 system() 或反引号执行用户输入的命令,除非你完全控制输入。


CGI 是无状态的,每次请求都独立。但你可以用 Cookie 来“记住”用户。

use CGI qw(:standard);

print header( -cookie => [
    'user_name' => '小明',
    'expires'   => '+1h',  # 1 小时后过期
] );

print "<p>已设置 Cookie,下次访问会记得你。</p>";
my $cookie = cookie('user_name');
if ($cookie) {
    print "<p>欢迎回来,$cookie!</p>";
} else {
    print "<p>第一次访问?欢迎!</p>";
}

总结:Perl CGI编程的价值

Perl CGI编程虽然不如现代框架流行,但它的设计理念——“简单、直接、可预测”——依然是优秀 Web 开发的基石。学习它,不仅能理解 Web 请求-响应的本质,还能掌握如何安全地处理用户输入、管理状态、构建动态页面。

无论你是初学者想理解 Web 工作原理,还是中级开发者想深入底层机制,Perl CGI编程都是一条值得走的路。它不复杂,但足够深刻。

现在,你已经拥有了第一个动态网页,下一步,就是用它去构建更多可能。