Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2308792
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类:

2006-08-28 21:34:51

早有耳闻PERL 可以简单地把一个文件一下子读入一个变量, 而且不管它是不是二进制的. 好象不止一次看到说 $/ = ""; 即可.

一直以为是这样, 直到遇到奇怪的现象, 二进制文件里混入了一个 0x0A, 这样的BUG很难找, 费了半天劲才找到是读入的时候就少读了内容.

搞不懂PERL为什么要设计成这样, 带来便利的同时你得了解太多的细节, 语言本身的规则太过复杂.

让$/= ""的效果等同于 undef $/ ; 难道不是更直观的设计吗. 鉴于此, 对PERL的使用一定要12万分的小心, 不要把自己的程序建立在不十分了解的语言特性和builtin函数, 操作符. 我唯一准备精通的是它的正则表达式的内容. 再就是二进制操作相关的东西:

pack/unpack 函数.
substr 返回值作为左值的效率.
ord, chr.
int() 和 整数操作的规则
StringWise 的位操作符号(一共4个 ~ & | ^)
用PERL操作二进制文件. 我已经犯过不少错误:
1. 千万记得打开一个文件后用 binmode(FILE_HANDLER). perl 5.8的open 可以直接指定打开的方式.
这在UNIX系统下是不必的. 但在windows下是必需的.
2. 分析大量数据要考虑正则表达式的效率和可读性.
关于可读性, 可以把复杂的表达式分解为多个子部分, 这些子部分用qr 操作符编译.
另外就是使用 x 这个modifier把各个部分分开

关于效率, 就要了解一些正则表达式内部的工作机制, 比如贪婪与回溯以及(?>)断言等.
另一个就是用 o 这个modifier来让表达式只编译一次.

3. 注意它的所有除法操作都是用浮点的.
对策: 用int() 转回来.
用 use integer; no integer ........ 这个还不会用.

4. 搞清楚PERL的数据类型与数据的机器表示之间的关系.
二进制数据都用 "\x0\x1" 这样的形式写.
阅读(1942) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~