如何使用Perl制作文件下载脚本

注意:如果只需要perl代码,则可以跳到本文的结尾。

介绍

许多网站都有您可以用来下载文件的表格或链接。 您单击一个表单按钮或单击一个链接,一两分钟后,您的Web浏览器中会弹出一个文件下载对话框,并提示您输入一些说明,例如“打开”或“保存”。 我将向您展示如何使用Perl脚本执行此操作。

你需要什么

任何最新版本的perl(5.06或更高版本都可以)和一台用于运行脚本的服务器。 最好使用允许您将文件存储在Web根目录之上的服务器,但这不是必需的。 稍微了解一下HTML会有所帮助,但这不是必需的。 通常,您将脚本上载到cgi-bin文件夹中,并将文件权限设置为755。服务器上载脚本的文件夹和权限可能会有所不同。

Perl代码

几乎所有作为CGI进程运行的perl脚本都需要以shebang行开头。 最常见的shebang行是:

#!/usr/bin/perl
它只是告诉服务器在哪里可以找到perl。 您的服务器所需的shebang行可能有所不同。 大多数网络主机会将这些信息发布在其网站的某个位置。 为了获得良好的perl编码实践和CGI安全性,我们将在shebang行上添加一个开关:-T。 注意:它必须是大写的T。
#!/usr/bin/perl -T
T代表“异味”模式。 作为脚本的程序员,这实际上是为了防止您犯一个可怕的错误,并允许CGI表单的用户将数据发送到服务器,而该数据可能以不安全的方式使用。 作为CGI进程运行的所有perl脚本都应使用-T开关,因此我将其包括在内。 模组

模块有点像可以在perl程序中使用的单独的perl程序。 许多人编写的模块已成为其他perl程序员一直使用的标准。 我们将使用以下模块:


use strict;
use warnings;
use CGI;
# Uncomment the next line only for debugging the script.
#use CGI::Carp qw/fatalsToBrowser/; 
前两个实际上不是模块,它们是实用程序。 它们会影响perl本身的功能。 在本文中,我不会对其进行解释。 您需要相信我,它们在几乎所有perl程序中都非常重要。 “ CGI”模块是将为我们完成大部分工作的模块:处理表单数据,打印http标头等。 “ CGI :: Carp”模块确实用于调试,如果有问题,可以帮助您使脚本运行。 如果有任何致命错误导致脚本失败,它将在屏幕上显示一条错误消息。 这些错误也将在服务器错误日志中打印出来。

程序的后两行建立了一些重要参数:


$CGI::POST_MAX = 1024;
$CGI::DISABLE_UPLOADS = 1; 
“ POST_MAX”以字节为单位设置将被视为过多数据的最大限制,并导致脚本返回错误。 我将此限制设置为较低(1 kb),因为此脚本需要发送给它的数据很少。 第二行告诉脚本不接受文件上传。 有道理,因为我们要下载文件,而不是上传文件。 这样可以防止用户尝试使用更改后的格式将文件发送到您的脚本。 可以保存所有表单并更改HTML代码,并且用户可以将所需的任何内容发送到脚本,这取决于您是否要在服务器端进行。 用户所做的一切完全不受您的控制。 设置路径和选项

####################################
#### User Configuration Section ####
#################################### 
# The path to where the downloadable files are. 
# Preferably this should be above the web root folder.
my $path_to_files = '/home/user/downloads/'; 
# The path to the error log file
my $error_log     = '/home/user/downloads/logs/errors.txt'; 
# Option to log errors: 1 = yes, 0 = no
my $log           = 1; 
# To prevent hot-linking to your script
my $url = 'http://www.yoursite.com';
########################################
#### End User Configuration Section ####
######################################## 
$ path_to_files是存储要下载文件的目录。 我建议您将它们存储在无法通过Web访问的文件夹中。 通常可以通过将它们放在与根Web文件夹平行的文件夹(public_html或www)中或上方的文件夹中来完成。

$ error_log是errors.txt文件的路径,该文件记录了脚本生成的错误。

$ log打开或关闭错误日志。

$ url应该是您网站的名称,包括“

http://”部分。 创建CGI对象
my $q = CGI->new;
$ q是我们将用于执行CGI模块的各种方法的对象。 我喜欢将其视为管家。 您告诉管家您想要什么,他知道如何完成,您不必担心细节。 我们的“管家”,$ q,将知道如何处理我们给他的“命令”。

实际上,CGI模块具有许多您可以赋予“管家”的“命令”。 我们将使用其中一些。 学习使用CGI模块几乎就像学习小型编程语言一样。 但是美丽之处在于您只需要知道命令的功能,而不是命令的方式即可。 就像真正的男管家一样,您必须相信他知道他在做什么,并且可以高效,高效地完成工作,而无需顾虑。 我建议您花些时间阅读CGI模块文档,即使您不太了解CGI模块文档,至少也应该熟悉基本的表单处理方法。 我留给你。

安全检查站

当将脚本作为CGI运行时,请不要低估对安全性的需求。 我们将使用三个“检查点”来检测任何可疑活动。 第一个是要检查发送到脚本的数据量。 我们将cgi_error()命令传递给值得信赖的男管家“ $ q”,他将返回响应$ error。 “ 413”表示已超过我们为$ CGI :: POST_MAX设置的限制,因此我们将检查该响应。 注意:在整篇文章中,我交替使用命令和方法来表示同一件事。


if (my $error = $q->cgi_error()){
   if ($error =~ /^413\b/o) {
      error('Maximum data limit exceeded.');
   }
   else {
      error('An unknown error has occured.'); 
   }
} 
接下来,我们检查是否有人尝试将文件上传到脚本。 为了发送文件,必须在CGI表单的“实体”属性中使用“多部分/表单数据”。

if ($ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|io ) {
   error('Invalid Content-Type : multipart/form-data.')
} 
接下来,我们检查使用脚本的请求是否来自您的网站。
if ($ENV{'HTTP_REFERER'} && $ENV{'HTTP_REFERER'} !~ m|^\Q$url|io) {
   error('Access forbidden.')
}
获取文件名

我将使用Vars方法将发送到脚本的所有参数转换为哈希值。 再次,我们调用“ $ q”进行实际工作。

my %IN = $q->Vars;
现在,我们确保有一个名为“ file”的参数。
my $file = $IN{'file'} or error('No file selected.');
验证,验证,验证

您说的还不够,必须验证发送到CGI脚本的所有数据。 如果我们只允许将任何内容发送到脚本,则有人可以发送以下内容:/ foo / bar并根据您附加的路径,脚本会乖乖地去查找foo目录并下载bar文件。 当然,人们可以尝试做一些更糟糕的事情,但这不是有关如何使用前门入侵网站的文章。 为了防止用户摆脱这种危险的特技,我们需要验证发送到脚本的数据。


if ($file =~ /^(\w+[\w.-]+\.\w+)$/) {
   $file = $1;
}
else {
   error('Invalid characters in filename.');
}     
该代码中看起来很神秘的部分($ file =〜/^(\w+[\w.-]+\.\w+)$/)被称为正则表达式(regexp)。 通常,正则表达式是用于验证/过滤表单数据的内容。 正则表达式已经超出了本文的范围。 如果您有兴趣了解该正则表达式,则必须阅读一些正则表达式教程。 请参阅文章末尾的在线资源。 基本上,它正在检查数据是否是这样的:frog.gif,puppy-dog.jpg或meatloaf.txt。 它以基本文件名格式filename.ext检查受限制的字符集“ a-zA-Z0-9_-。”,并拒绝其他任何无效字符。

上面的代码也“保留”了数据。 由于数据将用于打开服务器上的文件,因此我们必须取消对该文件的污染,以满足–T开关的要求,即我们没有做任何不安全的事情。 取消污染数据的唯一方法是使用正则表达式。 正则表达式中的括号将模式匹配存储在内存中,我们使用$ 1获得该值。 然后,我们将值分配回变量$ file,现在将用于打开文件的数据位于脚本的内部,并且–T开关将认为它可以安全使用。 由您决定验证/过滤足以完成任务。 例如,如果您在regexp /(.*)/中使用了此模式,则-T开关不会抱怨,但是数据将像在表单中输入或通过超链接一样发送到脚本中。 那将是一件愚蠢的事。

如果数据未通过验证例程,则会将一条消息发送到错误子例程,并向用户发出警报。

准备下载
download($file) or error('An unknown error has occured.');
如果文件下载失败,则会将一条消息发送到错误子例程,并向用户发出警报。 download()子例程

sub download {
   my $file = $_[0] or return(0); 
   # Uncomment the next line only for debugging the script 
   #open(my $DLFILE, '<', "$path_to_files/$file") or die "Can't open file '$path_to_files/$file' : $!"; 
   # Comment the next line if you uncomment the above line 
   open(my $DLFILE, '<', "$path_to_files/$file") or return(0); 
   # this prints the download headers with the file size included
   # so you get a progress bar in the dialog box that displays during file downloads. 
   print $q->header(-type            => 'application/x-download',
                    -attachment      => $file,
                    -Content_length  => -s "$path_to_files/$file",
   ); 
   binmode $DLFILE;
   print while <$DLFILE>;
   undef ($DLFILE);
   return(1);
} 
子例程的第一行获取文件名或将0(零)返回给调用方以指示失败。 有两行打开文件,一行用于调试目的,一行用于在一切正常运行时运行脚本。 代码的下一部分将显示使Web浏览器下载文件而不是尝试显示文件的标头。

   print $q->header(-type            => 'application/x-download',
                    -attachment      => $file,
                    -Content_length  => -s "$path_to_files/$file",
   ); 
header()方法中的“ type”选项是导致下载的特定标题。 的

“附件”选项定义要下载的文件的名称。 您可以给文件指定任何名称,而不必是实际的文件名。 如果您有理由隐藏文件的真实名称,或者需要为下载的文件提供真实名称以外的其他名称,则这可能很有用。 “ Content-length”选项使用–s文件测试操作符来获取文件的大小。 这允许文件下载对话框显示文件大小和进度条,并估计完成文件下载所需的时间。

子例程的最后四行完成了下载过程。


   binmode $DLFILE;
   print while <$DLFILE>;
   undef ($DLFILE);
   return(1); 
binmode()函数告诉perl以“二进制”模式传输文件。 使用二进制模式将在接收端损坏文件的可能性很小。 但是通常使用它没有问题,在某些情况下有必要。 如果在使用binmode时遇到问题,请删除或注释掉该行。 有关更多详细信息,请参见binmode函数文档。 “打印”行实际上是将文件从服务器传输到客户端的行。 “ undef”关闭文件,因为我使用了间接文件句柄。 我们在子例程末尾返回1(一)以指示成功。 子程序

“错误”子例程非常简单。 它使用一些html生成方法来打印基本的html文档,该文档显示了我们发送给它的错误消息,存储在$ _ [0]中。 CGI模块文档中讨论了每种方法。 如果您打开了错误日志记录,则也会调用“ log_error”函数。


sub error {
   print $q->header(-type=>'text/html'),
         $q->start_html(-title=>'Error'),
         $q->h3("Error: $_[0]"),
         $q->end_html;
   log_error($_[0]) if $log;
   exit(0);
} 
接下来是“ log_error”子例程。 可以检测到脚本检测到的每个错误,因此您可以查看站点的访问者如何滥用脚本。 这是值得跟踪的好信息。 可能矫over过正,但我​​坚信跟踪错误,因为它们可以帮助您编写更安全的脚本并向您发出警告,让您注意僵尸程序或试图滥用该脚本的人。 它将错误和一些其他信息附加到文件中。 我个人喜欢记录发送到脚本的名称/值对,以查看用户是否更改了表单或查询字符串。 这些值将在$ params中,格式如下:“ name =” value ::: name = value ::: name = value”。 “ scalar localtime()”为您带来方便,因此您可以轻松读取错误的日期/时间。 “时间”以纪元秒为单位记录日期/时间,这是记录日期/时间的标准方法,因此计算机程序和脚本可以理解它。 最终由您决定如何处理此信息。 我建议您不时检查一次错误日志。 您可以将其删除,脚本将创建一个新的脚本。 或者完全在脚本的“用户配置”部分中关闭错误日志记录。

sub log_error {
   my $error = $_[0]; 
   # Uncomment the next line only for debugging the script
   #open (my $log, ">>", $error_log) or die "Can't open error log: $!"; 
   # Comment the next line if you uncomment the above line
   open (my $log, ">>", $error_log) or return(0); 
   flock $log,2;
   my $params = join(':::', map{"$_=$IN{$_}"} keys %IN) || 'no params';
   print $log '"', join('","',time, 
                      scalar localtime(),
                      $ENV{'REMOTE_ADDR'},
                      $ENV{'SERVER_NAME'},
                      $ENV{'HTTP_HOST'},
                      $ENV{'HTTP_REFERER'},
                      $ENV{'HTTP_USER_AGENT'},
                      $ENV{'SCRIPT_NAME'},
                      $ENV{'REQUEST_METHOD'},
                      $params,
                      $error),
                      "\"\n";
} 
介面

剩下要做的唯一决定就是如何允许您网站的访问者访问下载脚本。 您可以使用超链接或HTML表单或两者的某种组合。 您可以让另一个脚本(甚至相同的脚本)生成该接口。 基本概念是将下载文件的名称传递给下载脚本。 使用超链接的示例:

<a href=”cgi-bin/download.pl?file=frog.jpg”>Download the Frog Image</a>
我将由您自己来发现创建下载脚本接口的其他方法。 结论

这是一个非常基本的脚本。 您可以向脚本添加更多功能,例如,添加一个计数器文件,该计数器文件跟踪每个文件的下载次数。 您可以添加身份验证,以便您的用户必须登录才能下载文件。 您可以将脚本绑定到数据库,而不是将文件存储在服务器上。

凯文(又名KevinADC)

本文受《

创用CC许可 资源 Perldoc网站所有在线perl文档。 CGI.pm CGI模块文档(在perldoc上)。 搜索CPAN综合Perl存档网络。 巨大的Perl模块存储库

和更多。

CGI安全性CGI安全性入门。 完整的脚本

#!/usr/bin/perl -T 
## Load pragmas and modules
use strict;
use warnings;
use CGI;
# Uncomment the next line only for debugging the script.
#use CGI::Carp qw/fatalsToBrowser/; 
# The next two lines are very important. Do not modify them
# if you do not understand what they do.
$CGI::POST_MAX = 1024;
$CGI::DISABLE_UPLOADS = 1;   
####################################
#### User Configuration Section ####
#################################### 
# The path to where the downloadable files are. 
# Prefereably this should be above the web root folder.
my $path_to_files = '/home/user/downloads/'; 
# The path to the error log file
my $error_log     = '/home/user/downloads/logs/errors.txt'; 
# Option to log errors: 1 = yes, 0 = no
my $log           = 1; 
# To prevent hot-linking to your script
my $url = 'http://www.yoursite.com'; 
####################################
## End User Configuration Section ##
#################################### 
# Edit below here at your own risk 
my $q = CGI->new; 
######################################
## This section checks for a number ##
## of possible errors or suspicious ##
## activity.                        ##
###################################### 
# check to see if data limit is exceeded
if (my $error = $q->cgi_error()){
   if ($error =~ /^413\b/o) {
      error('Maximum data limit exceeded.');
   }
   else {
      error('An unknown error has occured.'); 
   }
} 
# Check to see if the content-type is acceptable.
# multipart/form-data indicates someone is trying
# to upload data to the script with a hacked form.
# $CGI_DISABLE_UPLOADS prevents uploads. This routine
# is to catch the attempt and log it. 
if ($ENV{'CONTENT_TYPE'} =~ m|^multipart/form-data|io ) {
   error('Invalid Content-Type : multipart/form-data.')
}        
# Check if the request came from your website, if not
# it indicates remote access or hot linking.
if ($ENV{'HTTP_REFERER'} && $ENV{'HTTP_REFERER'} !~ m|^\Q$url|io) {
   error('Access forbidden.')
} 
################################
## End error checking section ##
################################ 
# Get the data sent to the script.
my %IN = $q->Vars; 
# Parse the "file" paramater sent to the script.
my $file = $IN{'file'} or error('No file selected.'); 
# Here we untaint the filename and make sure there are no characters like '/' 
# in the name that could be used to download files from any folder on the website.
if ($file =~ /^(\w+[\w.-]+\.\w+)$/o) {
   $file = $1;
}
else {
   error('Invalid characters in filename.');
}     
# Check if the download succeeded
download($file) or error('An unknown error has occured.');  
#################
## SUBROUTINES ##
################# 
# download the file
sub download {
   my $file = $_[0] or return(0); 
   # Uncomment the next line only for debugging the script 
   #open(my $DLFILE, '<', "$path_to_files/$file") or die "Can't open file '$path_to_files/$file' : $!"; 
   # Comment the next line if you uncomment the above line 
   open(my $DLFILE, '<', "$path_to_files/$file") or return(0); 
   # This prints the download headers with the file size included
   # so you get a progress bar in the dialog box that displays during file downlaods. 
   print $q->header(-type            => 'application/x-download',
                    -attachment      => $file,
                    'Content-length' => -s "$path_to_files/$file",
   ); 
   binmode $DLFILE;
   print while <$DLFILE>;
   undef ($DLFILE);
   return(1);
} 
# This is a very generic error page. You should make a better one.
sub error {
   print $q->header(-type=>'text/html'),
         $q->start_html(-title=>'Error'),
         $q->h3("Error: $_[0]"),
         $q->end_html;
   log_error($_[0]) if $log;
   exit(0);
} 
# Log the error to a file
sub log_error {
   my $error = $_[0]; 
   # Uncomment the next line only for debugging the script
   #open (my $log, ">>", $error_log) or die "Can't open error log: $!"; 
   # Comment the next line if you uncomment the above line
   open (my $log, ">>", $error_log) or return(0); 
   flock $log,2;
   my $params = join(':::', map{"$_=$IN{$_}"} keys %IN) || 'no params';
   print $log '"', join('","',time, 
                      scalar localtime(),
                      $ENV{'REMOTE_ADDR'},
                      $ENV{'SERVER_NAME'},
                      $ENV{'HTTP_HOST'},
                      $ENV{'HTTP_REFERER'},
                      $ENV{'HTTP_USER_AGENT'},
                      $ENV{'SCRIPT_NAME'},
                      $ENV{'REQUEST_METHOD'},
                      $params,
                      $error),
                      "\"\n";
}

From: https://bytes.com/topic/perl/insights/857373-how-make-file-download-script-perl

目 录 译者序 前言 第一部分 Perl基础 第1学时 Perl入门 3 1.1 安装Perl 3 1.1.1 等一等,也许你已经安装了Perl 4 1.1.2 在Windows 95/98/NT上安装Perl 5 1.1.3 在UNIX上安装Perl 6 1.1.4 在Macintosh系统上安装Perl 7 1.2 文档资料 7 1.2.1 某些特殊的文档资料举例 8 1.2.2 如果无法找到文档该怎么办 9 1.3 编写你的第一个Perl程序 9 1.3.1 键入程序 9 1.3.2 运行程序 9 1.3.3 程序正确将会发生什么情况 10 1.3.4 Perl程序的具体运行过程 10 1.3.5 必须知道的一些情况 11 1.4 课时小结 12 1.5 课外作业 12 1.5.1 专家答疑 12 1.5.2 思考题 12 1.5.3 解答 13 1.5.4 实习 13 第2学时 Perl的基本构件:数字和 字符串 14 2.1 直接量 14 2.1.1 数字 14 2.1.2 字符串 15 2.2 标量变量 16 2.3 表达式和运算符 18 2.3.1 基本运算符 18 2.3.2 数字运算符 19 2.3.3 字符串运算符 19 2.4 其他运算符 20 2.4.1 单参数运算符 20 2.4.2 递增和递减 21 2.4.3 尖括号运算符 21 2.4.4 其他赋值运算符 22 2.4.5 关于字符串和数字的一些说明 22 2.5 练习:利息计算程序 23 2.6 课时小结 24 2.7 课外作业 24 2.7.1 专家答疑 24 2.7.2 思考题 24 2.7.3 解答 25 2.7.4 实习 25 第3学时 控制程序流 26 3.1 语句块 26 3.2 if语句 27 3.2.1 其他关系运算符 28 3.2.2 “真”对于Perl意味着什么 29 3.2.3 逻辑运算符 30 3.3 循环 32 3.3.1 用while进行循环 32 3.3.2 使用for循环 33 3.4 其他流控制工具 33 3.4.1 奇特的执行顺序 33 3.4.2 明细控制 34 3.4.3 标号 35 3.4.4 退出Perl 35 3.5 练习:查找质数 35 3.6 课时小结 37 3.7 课外作业 37 3.7.1 专家答疑 37 3.7.2 思考题 37 3.7.3 解答 38 3.7.4 实习 38 第4学时 基本构件的堆栈:列表与数组 39 4.1 将数据放入列表和数组 39 4.2 从数组中取出元素 41 4.2.1 寻找结尾 42 4.2.2 关于上下文的详细说明 43 4.2.3 回顾以前的几个功能 44 4.3 对数组进行操作 45 4.3.1 遍历数组 46 4.3.2 在数组与标量之间进行转换 46 4.3.3 给数组重新排序 48 4.4 练习:做一个小游戏 49 4.5 课时小结 51 4.6 课外作业 51 4.6.1 专家答疑 51 4.6.2 思考题 51 4.6.3 解答 52 4.6.4 实习 52 第5学时 进行文件操作 53 5.1 打开文件 53 5.1.1 路径名 54 5.1.2 出色的防错措施 55 5.1.3 以适当的方式运行die函数 56 5.2 读取文件 56 5.3 写入文件 58 5.4 自由文件、测试文件和二进制数据 60 5.4.1 自由文件句柄 60 5.4.2 二进制文件 60 5.4.3 文件测试运算符 61 5.5 课时小结 62 5.6 课外作业 62 5.6.1 专家答疑 62 5.6.2 思考题 63 5.6.3 解答 63 5.6.4 实习 63 第6学时 模式匹配 64 6.1 简单的模式 64 6.2 元字符 66 6.2.1 一个简单的元字符 66 6.2.2 非输出字符 66 6.2.3 通配符 66 6.2.4 字符类 68 6.2.5 分组和选择 69 6.2.6 位置通配符 69 6.3 替换 70 6.4 练习:清除输入数据 70 6.5 关于模式匹配的其他问题 71 6.5.1 对其他变量进行操作 71 6.5.2 修饰符与多次匹配 72 6.5.3 反向引用 73 6.5.4 一个新函数:grep 73 6.6 课时小结 74 6.7 课外作业 74 6.7.1 专家答疑 74 6.7.2 思考题 75 6.7.3 解答 75 6.7.4 实习 75 第7学时 哈希结构 77 7.1 将数据填入哈希结构 77 7.2 从哈希结构中取出数据 78 7.3 列表与哈希结构 80 7.4 关于哈希结构的补充说明 81 7.4.1 测试哈希结构中的关键字 81 7.4.2 从哈希结构中删除关键字 81 7.5 用哈希结构进行的有用操作 81 7.5.1 确定频率分布 82 7.5.2 在数组中寻找惟一的元素 82 7.5.3 寻找两个数组之间的交汇部分 和不同部分 83 7.5.4 对哈希结构进行排序 84 7.6 练习:用Perl创建一个简单的客户 数据库 84 7.7 课时小结 86 7.8 课外作业 86 7.8.1 专家答疑 86 7.8.2 思考题 87 7.8.3 解答 87 7.8.4 实习 88 第8学时 函数 89 8.1 创建和调用子例程 89 8.1.1 返回子例程的值 90 8.1.2 参数 91 8.1.3 传递数组和哈希结构 91 8.2 作用域 92 8.3 练习:统计数字 94 8.4 函数的脚注 96 8.4.1 声明local变量 96 8.4.2 使Perl变得更加严格 97 8.4.3 递归函数 98 8.5 课时小结 99 8.6 课外作业 99 8.6.1 专家答疑 99 8.6.2 思考题 99 8.6.3 解答 100 8.6.4 实习 100 第二部分 高级特性 第9学时 其他函数和运算符 103 9.1 搜索标量 103 9.1.1 用index进行搜索 103 9.1.2 用rindex向后搜索 104 9.1.3 用substr分割标量 104 9.2 转换而不是替换 105 9.3 功能更强的print函数 106 9.4 练习:格式化报表 107 9.5 堆栈形式的列表 109 9.6 课时小结 110 9.7 课外作业 111 9.7.1 专家答疑 111 9.7.2 思考题 111 9.7.3 解答 112 9.7.4 实习 112 第10学时 文件与目录 113 10.1 获得目录列表 113 10.2 练习:UNIX的grep 116 10.3 目录 117 10.3.1 浏览目录 117 10.3.2 创建和删除目录 118 10.3.3 删除文件 119 10.3.4 给文件改名 119 10.4 UNIX系统 120 10.5 你应该了解的关于文件的所有信息 121 10.6 练习:对整个文件改名 122 10.7 课时小结 123 10.8 课外作业 124 10.8.1 专家答疑 124 10.8.2 思考题 124 10.8.3 解答 124 10.8.4 实习 125 第11学时 系统之间的互操作性 126 11.1 system()函数 126 11.2 捕获输出 128 11.3 管道 129 11.4 可移植性入门 131 11.5 课时小结 134 11.6 课外作业 134 11.6.1 专家答疑 134 11.6.2 思考题 135 11.6.3 解答 135 11.6.4 实习 136 第12学时 使用Perl的命令行工具 137 12.1 什么是调试程序 137 12.1.1 启动调试程序 137 12.1.2 调试程序的基本命令 138 12.1.3 断点 139 12.1.4 其他调试程序命令 140 12.2 练习:查找错误 141 12.3 其他命令行特性 142 12.3.1 单命令行程序 142 12.3.2 其他开关 143 12.3.3 空的尖括号与更多的单命令 行程序 144 12.4 课时小结 145 12.5 课外作业 145 12.5.1 专家答疑 145 12.5.2 思考题 146 12.5.3 解答 146 第13学时 引用与结构 147 13.1 引用的基本概念 147 13.1.1 对数组的引用 149 13.1.2 对哈希结构的引用 149 13.1.3 作为参数的引用 150 13.1.4 创建各种结构 151 13.2 结构的配置方法 152 13.2.1 一个例子:列表中的列表 152 13.2.2 其他结构 153 13.2.3 使用引用来调试程序 154 13.3 练习:另一个游戏——迷宫 155 13.4 课时小结 157 13.5 课外作业 157 13.5.1 专家答疑 157 13.5.2 思考题 158 13.5.3 解答 158 13.5.4 实习 158 第14学时 使用模块 159 14.1 模块的概述 159 14.1.1 读取关于模块的文档 160 14.1.2 什么地方可能出错 161 14.2 已安装模块简介 162 14.2.1 文件和目录简介 162 14.2.2 拷贝文件 164 14.2.3 用于通信的Perl模块 164 14.2.4 使用English模块 165 14.2.5 diagnostics模块 165 14.3 标准模块的完整列表 166 14.4 课时小结 167 14.5 课外作业 167 14.5.1 专家答疑 167 14.5.2 思考题 168 14.5.3 解答 168 14.5.4 实习 168 第15学时 了解程序的运行性能 169 15.1 DBM文件 169 15.1.1 需要了解的重点 170 15.1.2 遍历与DBM文件相连接的哈 希结构 170 15.2 练习:一种自由格式备忘记事板 171 15.3 将文本文件用作数据库 173 15.4 随机访问文件 175 15.4.1 打开文件进行读写操作 175 15.4.2 在读写文件中移动 176 15.5 锁定文件 176 15.5.1 锁定UNIX和NT下的文件 178 15.5.2 在加锁情况下进行读写操作 179 15.5.3 Windows 95和Windows 98下的 加锁问题 180 15.5.4 在其他地方使用文件锁的问题 181 15.6 课时小结 181 15.7 课外作业 181 15.7.1 专家答疑 181 15.7.2 思考题 182 15.7.3 解答 182 15.7.4 实习 182 第16学时 Perl语言开发界 183 16.1 Perl究竟是一种什么语言 183 16.1.1 Perl的简单发展历史 183 16.1.2 开放源 184 16.1.3 Perl的开发 185 16.2 Perl综合存档文件网 185 16.2.1 什么是CPAN 186 16.2.2 为什么人们愿意提供自己的开 发成果 186 16.3 下一步你要做的工作 187 16.3.1 要做的第一步工作 187 16.3.2 最有用的工具 187 16.3.3 查找程序中的错误 188 16.3.4 首先要靠自己来解决问题 188 16.3.5 从别人的程序错误中吸取教训 189 16.3.6 请求他人的帮助 190 16.4 其他资源 191 16.5 课时小结 192 16.6 课外作业 192 16.6.1 专家答疑 192 16.6.2 思考题 192 16.6.3 解答 192 第三部分 将Perl用于CGI 第17学时 CGI概述 195 17.1 浏览Web 195 17.1.1 检索一个静态Web页 196 17.1.2 动态Web页—使用CGI 197 17.2 不要跳过这一节内容 198 17.3 编写你的第一个CGI程序 199 17.3.1 在服务器上安装CGI程序 200 17.3.2 运行你的CGI程序 201 17.4 CGI程序无法运行时怎么办 201 17.4.1 这是你的CGI程序吗 201 17.4.2 服务器存在的问题 202 17.4.3 排除服务器内部错误或500错误 203 17.5 课时小结 204 17.6 课外作业 204 17.6.1 专家答疑 204 17.6.2 思考题 205 17.6.3 解答 205 17.6.4 实习 206 第18学时 基本窗体 207 18.1 窗体是如何运行的 207 18.1.1 HTML窗体元素概述 207 18.1.2 单击submit时出现的情况 208 18.2 将信息传递给你的CGI程序 209 18.3 Web安全性 211 18.3.1 建立传输明码文本的连接 211 18.3.2 注意不安全数据 212 18.3.3 从事无法执行的操作 213 18.3.4 拒绝服务 213 18.4 宾客留言簿 214 18.5 课时小结 215 18.6 课外作业 215 18.6.1 专家答疑 215 18.6.2 思考题 216 18.6.3 解答 216 18.6.4 实习 216 第19学时 复杂窗体 217 19.1 复杂的多页窗体 217 19.2 隐藏域 217 19.3 多页调查窗体 219 19.4 课时小结 224 19.5 课外作业 224 19.5.1 专家答疑 224 19.5.2 思考题 225 19.5.3 解答 225 19.5.4 实习 225 第20学时 对HTTP和CGI进行操作 226 20.1 HTTP通信概述 226 20.1.1 举例:人工检索Web页 227 20.1.2 举例:返回非文本信息 228 20.2 如何调用CGI程序的详细说明 230 20.2.1 将参数传递给CGI程序 230 20.2.2 特殊参数 231 20.3 服务器端的包含程序 232 20.4 部分环境函数简介 234 20.5 重定向 235 20.6 课时小结 237 20.7 课外作业 237 20.7.1 专家答疑 237 20.7.2 思考题 237 20.7.3 解答 238 20.7.4 实习 238 第21学时 cookie 239 21.1 什么是cookie 239 21.1.1 如何创建cookie 240 21.1.2 举例:使用cookie 241 21.1.3 另一个例子:cookie查看器 242 21.2 高级cookie特性 243 21.2.1 设置cookie终止运行的时间 243 21.2.2 cookie的局限性 244 21.2.3 将cookie发送到其他地方 244 21.2.4 限制cookie返回到的位置 246 21.2.5 带有安全性的cookie 247 21.3 cookie存在的问题 247 21.3.1 cookie的生存期很短 247 21.3.2 并非所有浏览器都支持cookie 247 21.3.3 有些人不喜欢cookie 247 21.4 课时小结 248 21.5 课外作业 248 21.5.1 专家答疑 248 21.5.2 思考题 249 21.5.3 解答 250 21.5.4 实习 250 第22学时 使用CGI程序发送电子邮件 251 22.1 Internet邮件入门 251 22.1.1 发送电子邮件 252 22.1.2 发送邮件时首先应该注意的问题 252 22.2 邮件发送函数 253 22.2.1 用于UNIX系统的邮件函数 254 22.2.2 用于非UNIX系统的邮件函数 255 22.3 从Web页发送邮件 257 22.4 课时小结 259 22.5 课外作业 259 22.5.1 专家答疑 259 22.5.2 思考题 260 22.5.3 解答 260 22.5.4 实习 260 第23学时 服务器推送和访问次数 计数器 261 23.1 什么是服务器推送 261 23.1.1 激活服务器推送特性 262 23.1.2 一个小例子:更新Web页上 的时钟 262 23.1.3 另一个例子:动画 263 23.1.4 客户机拖拉技术 264 23.2 访问次数计数器 264 23.2.1 编写一个访问次数计数器程序 266 23.2.2 图形访问次数计数器 267 23.3 课时小结 268 23.4 课外作业 269 23.4 1 专家答疑 269 23.4.2 思考题 269 23.4.3 解答 269 23.4.4 实习 270 第24学时 建立交互式Web站点 271 24.1 借用另一个站点的内容 271 24.1.1 注意内容的版权问题 271 24.1.2 举例:检索标题 272 24.2 调查窗体 275 24.2.1 调查窗体程序的第一部分: 提出问题 276 24.2.2 调查窗体程序的第二部分: 计算调查结果 277 24.3 课时小结 280 24.4 课外作业 280 24.4.1 专家答疑 280 24.4.2 思考题 281 24.4.3 解答 281 24.4.4 实习 281 第四部分 附录 附录 安装模块 285
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值