第一部分 Perl调试概述 3
第1章 绪论 3
1.1 漏洞类型 5
1.1.1 输入漏洞 5
1.1.2 逻辑漏洞 6
1.1.3 执行漏洞 7
1.2 预防漏洞 8
1.2.1 程序设计 8
1.2.2 编辑器 9
1.2.3 格式编排 9
1.2.4 注释 10
1.3 代码修订 11
第二部分 Perl的逻辑和语法 15
第2章 基本的Perl解析规则和陷阱 15
2.1 执行过程 16
2.1.1 体系结构 17
2.1.2 内部对象 17
2.1.3 翻译器 19
2.1.4 操作码 19
2.1.5 编译 22
2.1.6 执行 24
2.1.7 执行总结 24
2.2 语法和解析规则 25
2.2.1 基本语法 25
2.3 注释 26
2.3.1 组件标识 28
2.3.2 优先级 28
2.3.3 空词 42
2.3.4 上下文 43
2.3.5 逻辑值 44
第3章 常见的变量陷阱 45
3.1 创建/使用变量 46
3.1.1 标量 47
3.1.2 数组 47
3.1.3 哈希表 50
3.1.4 列表 53
3.1.5 文件句柄 53
3.1.6 使用defined 53
3.1.7 缺省值 54
3.2 变量范围 54
3.2.1 my的作用范围 54
3.2.2 local的作用范围 55
3.2.3 our的作用范围 56
3.3 特殊变量 56
3.3.1 @_数组 56
3.3.2 $_标量 57
3.3.3 标量$a和$b 58
3.3.4 $1..$9和其他Regex变量 59
3.4 引用 59
3.4.1 标量 59
3.4.2 数组 60
3.4.3 哈希表 60
3.4.4 函数 62
3.4.5 Globs 62
3.4.6 嵌套结构 62
3.4.7 引用类型 64
3.5 对象 64
3.6 变量,引号和插值 65
3.6.1 引号操作符 65
3.6.2 here 文档 66
3.6.3 变量插值和字符串插值 66
第4章 语句陷阱和函数陷阱 69
4.1 测试和比较 70
4.2 循环 70
4.2.1 使用while 70
4.2.2 do{}while循环 71
4.2.3 for和foreach循环 71
4.2.4 控制语句 72
4.3 正则表达式陷阱 73
4.4 函数陷阱 74
4.4.1 alarm 79
4.4.2 binmode 79
4.4.3 chdir 80
4.4.4 chomp 80
4.4.5 chop 80
4.4.6 chown 80
4.4.7 crypt 80
4.4.8 delete 80
4.4.9 each 81
4.4.10 eval 81
4.4.11 exec 81
4.4.12 exists 81
4.4.13 exit 82
4.4.14 fork 82
4.4.15 gmtime/localtime 82
4.4.16 join 82
4.4.17 keys/values 82
4.4.18 map 83
4.4.19 open 83
4.4.20 print 83
4.4.21 sprintf 84
4.4.22 ref 84
4.4.23 scalar 85
4.4.24 seek 85
4.4.25 select(filehandle) 85
4.4.26 select(files) 85
4.4.27 shift、unshift/pop和push 85
第5章 程序设计 87
5.1 分离 88
5.1.1 开发良好的子程序 89
5.1.2 解析参数 89
5.1.3 开发良好的模块 93
5.1.4 开发良好的类 96
5.2 节省时间的技巧 97
5.2.1 原型 97
5.2.2 调度表 100
5.2.3 引用 102
5.3 注释和文档 104
5.3.1 编写注释 104
5.3.2 编制文档 105
第6章 语言/平台移植指南 109
6.1 语言移植陷阱 110
6.1.1 和awk/gawk之间的差异 110
6.1.2 C陷阱 111
6.1.3 sed陷阱 113
6.1.4 emacs陷阱 113
6.1.5 shell脚本陷阱 114
6.1.6 Python陷阱 114
6.2 平台移植陷阱 116
6.2.1 支持的函数 116
6.2.2 常量的兼容性 117
6.2.3 执行环境 117
6.2.4 错误 118
6.2.5 行结束符 118
6.2.6 字符集 118
6.2.7 数据差异 119
6.2.8 文件和路径名 119
6.2.9 模块 119
6.2.10 性能和资源 120
6.2.11 平台移植技巧 120
第三部分 捕获错误 125
第7章 捕获基本错误 125
7.1 为什么检查错误? 128
7.2 为脚本添加错误检查 129
7.2.1 使用if 129
7.2.2 使用unless 129
7.2.3 使用条件操作符 130
7.2.4 使用简化逻辑 130
7.2.5 错误检查准则 131
7.2.6 错误检查预演 131
7.3 需要检查的内容 134
7.4 不需要检查的内容 135
7.4.1 不要检查无关紧要的内容 135
7.4.2 用户输入 135
7.4.3 替换/直译 136
7.5 何时停止检查 136
7.5.1 不要检查两次 136
7.5.2 函数、返回值和嵌套 137
7.6 错误消息和错误号 139
7.7 在脚本内报告错误 139
7.7.1 Warn函数 140
7.7.2 Die函数 140
7.7.3 Propagation和eval 141
7.7.4 定向和标记 142
7.8 在模块内报告错误 143
7.8.1 Carp函数 144
7.8.2 Cluck函数 144
7.8.3 Croak函数 144
7.8.4 Confess函数 145
7.9 在GUIs和Web应用程序内报告错误 145
7.9.1 TK对话 145
7.9.2 Web错误报告 148
第8章 使用编译选项和警告 151
8.1 警告 152
8.1.1 $^W变量 153
8.1.2 早期的warning编译选项 153
8.1.3 Perl 5.6的词法警告 154
8.2 strict编译选项 158
8.2.1 vars选项 159
8.2.2 refs选项 160
8.2.3 subs选项 161
8.3 Perl的其他编译选项 162
8.3.1 autouse 163
8.3.2 base 163
8.3.3 blib 164
8.3.4 常量 164
8.3.5 diagnostics 165
8.3.6 fields 167
8.3.7 integer 168
8.3.8 less 168
8.3.9 lib 168
8.3.10 ops 169
8.3.11 re 169
8.3.12 sigtrap 170
8.3.13 subs 171
8.3.14 vars 172
第9章 人工调试技术 173
9.1 使用print 174
9.1.1 引用信息 175
9.1.2 跟踪执行 176
9.1.3 使用调试选项 177
9.2 使用caller 178
9.3 使用eval 181
9.4 信号 183
9.4.1 作为异常的信号 184
9.4.2 _WARN_信号和_DIE_信号 184
9.5 写日志 187
9.6 重定向STDOUT/STDERR 187
9.6.1 使用日志函数 188
9.6.2 向syslog报告 189
9.6.3 向Windows NT/2000 Event log报告 190
第10章 Perl调试器 193
10.1 使用调试器 194
10.1.1 监视 194
10.1.2 单步方式 195
10.1.3 断点 195
10.2 Perl调试器 195
10.2.1 用户界面 196
10.2.2 调试器命令 197
10.2.3 使用非交互模式 206
10.2.4 定制 207
10.2.5 可供选择的两种界面 208
10.3 ActivePerl调试器 209
10.3.1 调试器界面 209
10.3.2 Registers(寄存器) 211
10.3.3 Proximity面板 212
10.3.4 Watches面板 213
10.3.5 执行语句 213
10.3.6 调试工具 214
10.3.7 书签 217
10.3.8 使用工具 218
10.4 命令行调试 219
10.4.1 标记和解析 220
10.4.2 Stack Snapshots 221
10.4.3 上下文(循环)栈处理 222
10.4.4 跟踪执行 224
10.4.5 方法和重载方案 225
10.4.6 字符串/数值转换 226
10.4.7 显示预处理程序(适用于CPP) 227
10.4.8 内存分配 228
10.4.9 格式处理 228
10.4.10 正则表达式 230
10.4.11 语法树 235
10.4.12 脏检查 236
10.4.13 内存泄漏 236
10.4.14 哈希表卸出 237
10.4.15 分配中间结果暂存器 239
10.4.16 清除 239
10.4.17 线程同步 240
10.5 调试内存使用 242
10.5.1 真正含义 244
第四部分 优化代码 247
第11章 手工优化 247
11.1 跟踪执行 248
11.2 发现资源下降 249
11.2.1 提高速度 249
11.2.2 减少内存 253
第12章 自动优化 255
12.1 Perl剖析器 256
12.1.1 脚本剖析实例 258
12.1.2 一次命中剖析 261
12.1.3 剖析的备选方案 261
12.2 使用编译器 262
12.2.1 后端 263
12.2.2 perlcc前端 273
12.2.3 解释代码和编译代码之间的区别 276
12.3 比较脚本和可执行程序的速度 277
12.3.1 测试 278
12.3.2 归纳结论 281
第五部分 测试代码 285
第13章 测试方法 285
13.1 测试装具模块的角色 286
13.2 测试策略 287
13.2.1 测试示例 287
13.2.2 测试内容 291
13.2.3 界限和范围 291
13.3 建立测试装具模块 293
13.3.1 使用Test模块 294
13.3.2 使用Test∶∶Harness 296
13.3.3 CGI Harness 297
第14章 中断代码 299
14.1 磁盘空间 300
14.2 CPU时间 302
14.3 环境变量 304
14.4 安全和权限 306
14.5 脏数据 306
14.5.1 使用脏模式 306
14.5.2 检查数据和澄清数据 308
14.6 Web服务器 309
14.6.1 Web环境 309
14.6.2 网络通信 310
14.6.3 外部程序 311
14.6.4 用户安全性 311
14.6.5 超时 311
14.7 Web数据 312
14.8 多重执行 313
第六部分 附录 315
附录A 错误交叉参考 315