在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
取模操作符先取整然后在求余. 除了单引号和反斜线字符外, 单引号内所有字符都代表他们自己(包括换行字符, 如果该字符串表示多行的数据的话)... 只有在后面是另一个反斜线或者单引号时, 前面的反斜线才有特殊意义. (p.32) 复制次数 (右操作数) 在使用前会先取整 (4.8 变成 4). 复制次数小于 1 时, 会生成长度为零的空字符串. (p.34) 字符串中非数字的部分 (以及前置的空白符号) 会被忽略, 所以 "12fred34" * "3" 也会得出 36, 而不会出现任何警告信息. 在最极端情况下, 完全不含数字的字符串会被转换成零. 在 Perl 术语里面, ($) 这种符号叫做 "印记" (sigil). (p.37) 全大写 (例如 $ARGV) 通常用来表示某种特殊变量. (p.38) 双目赋值操作符都是以某种方式直接修改变量的值, 而非对表达式求值后覆盖原变量值. (p.39) 如果变量从来没有被赋值过, 就会用空字符串来代替. 如果字符串后面有两个以上的换行符, chomp 也仅仅删除一个. 如果结尾处没有换行符, 它什么也不做, 直接返回零. (p.46) 在首次被赋值之前, 变量的初始值都是特殊的 undef (未定义), 它在 Perl 里的意思只不过是: 这里空无一物 ... 把这个 "空无一物" 当成数字使用, 它就会假设这是 0, 如果当成字符串使用, 它就会假设这是空字符串. 但是 undef 既不是数字也不是字符串, 它完全是另一种类型的标量值. (p.47) 数组的名字空间 (namespace) 和标量的名字空间, 是完全分开的. (p.50) 如果下标超出数组的尾端, 则对应的值将会是 undef. 范围操作符 (range operator), ... 从左边的数字计数到右边, 每次加 1. 因为 qw 算是一种引号所以不能将注释放在 qw 列表中. (p.53) 对列表进行复制时, 出来的之会被悄悄忽略掉 ... 另一种情况, 如果变量的个数多余给定的列表值, 那么那些多出来的变量将会被设成 undef. 将某个数组复制到另一个数组时, 仍然算是列表的赋值运算, 只不过这些列表时存储在数组里而已. (p.55) 如果数组是空的, pop 什么也不做 (因为没有元素可供移出), 直接返回 undef. 在循环中修改了控制变量的值, 也就同时修改了这个列表元素. 假如你在 foreach 循环的开头省略了控制变量, Perl 就会使用它的 "老地方" 变量 $_. sort 在标量上下文中总是返回 undef. (p.61) reverse 在列表上下文中, 它很自然地返回逆序后的列表; 在标量上下文中, 则返回逆序后的字符串 (先将列表中所有的字符串全部连接在一起, 再对结果进行反序处理):
可以直接把数组交给 chomp, 它会自动去掉每个元素的换行符. (p.64) 假如你定义了两个重名的子程序, 那么后面的那个子程序会覆盖掉前面的. (p.67) 在 Perl 中, 所有的子程序都有一个返回值 --- 子程序并没有 "有返回值" 和 "没有返回值" 之分. 但并不是所有的 Perl 子程序都包含有用的返回值. 虽然 Perl 允许你省略语句块的最后一个分号, 但实际上通常只有在程序代码简洁到整个语句块只有一行时, 才有必要省略分号. (p.71) my 操作符并不会改变变量赋值时的上下文: 请记住, 在 my 不使用括号时, 只用来声明单个词法变量: "行输入" 操作符和 Perl 的 "老地方" 变量 ($_) 之间没有任何关联. (p.84) 因为 foreach 在循环能够开始之前, 它必须先将输入全部读进来, 因此最好的做法, 通常是尽量使用 while 循环的简写, 让它每次处理一行. (p.85) 使用钻石操作符时, 就好像这些文件已经合并成一个很大的文件. 由于钻石操作符通常会处理所有的输入, 所以当它在程序里出现好几次时, 通常是错误的. printf 要输出真正的百分号, 请使用 %%, 它的特殊之处在于, 不会输出 (参数) 列表中的任何元素. Larry 也建议你使用权大写字母来命名文件句柄. (p.93)
注意大于号后的空格. Perl 会忽略它, 但这个空格能防止意外发生. 如果 $selected_output 的值也是 ">passwd" 而之前有没有空格的话, 就会变成以替换方式写入, 而非以追加方式写入文件. (p.96) 当你重新打开某个文件句柄时(也就是说, 在新的 open 命令中重用之前的文件句柄名), Perl 会自动关闭原先的文件句柄. 在程序结束时, Perl 也会自动关闭文件句柄. (p.98) 将数据输出到文件句柄时, 默认情况下都会经过缓冲的处理. 不过, 只要将特殊变量 $| 设置为 1, 就会使当前的(也就是修改变量时所指定的)默认文件句柄在每次进行输出操作后, 立刻刷新缓冲区. (p.102) 哈希变量的命名和其他 Perl 的标识符相似, 可以有字母, 数字和下划线, 但不可以用数字开头. 另外哈希有自己的命名空间, 也就是说哈希元素 $family_name{"fred"} 和子程序 &family_name 之间毫无关联. (p.109)
之所以顺序乱掉是因为 Perl 已经为哈希的快速检索而对键/值对的存储做了特别的排序. 因此选择使用哈希的场合, 要么元素存储顺序无关紧要, 要么可以容易地在元素输出是进行排序. 在任何需要逗号的地方都可以用胖箭头代替, 这对 Perl 来说没什么区别. (p.112) 在标量上下文中, 这两个函数(keys 和 values)都会返回哈希中键/值对的个数. (p.113) 赋值后得到的列表, 在标量上下文中的求值结果为列表的成员数量. 在 delete 之后, 键便不会出现在哈希之中, 但是存入 undef 之后键却一定会存在. 整个哈希的内插是不支持的, "%books" 的结果只是 6 个字符的串 %books. (p.117) 点号 (.) 是任何单字符的通配符, 当然换行 (也就是 "\n" ) 要除外. (p.121) 如何区分哪个括号是第几组? [\d\D], 表示任何数字或非数字. 也就是说, 它会匹配任何字符! 这是匹配任意字符 (包括换行符) 的常见做法. (而点号 . 则匹配换行符以外的所有字符). p.128 在 Perl 里, 注释也算是一种空白. 美元符 ($) ... 除了匹配字符串的结尾之外, 它同时也匹配字符串结尾的换行符. \b 锚位匹配的是一组 \w 字符的开头或结尾. (p.133) 失败的匹配不会改变上次成功匹配时捕获的内容, 而成功的匹配会将它们重置. (p.136) 一旦你在程序中的任何部分使用了某个自动匹配变量, 其他正则表达式的运行速度会变慢. (p.141) /g 修饰符可让 s/// 进行所有可能的、 不重复的替换. split 是一个操作符, 虽然它的行为看来想一个函数, 而且大家通常都会称它为函数. (p.149) split 会保留开头处的空字符, 并省略结尾处的空字段. ... 你可以把 join 的第一个参数理解为胶水, 它可以是任何字符串, 其余的参数则是一串片段. join 会把胶水涂进每个片段之间, 并返回结果字符串. (p.151) 在列表上线文中使用模式匹配操作符 (m//) 时, 如果模式匹配成功, 那么返回的是所有捕获变量的列表; 如果匹配失败, 则返回空列表. (p.151) 在 Perl 中有 5 种循环块. 也就是 for、 foreach、 while、 until 以及裸块. 而 if 块或者子程序带的话括号不是循环的块. 在 Perl 里, 标签和其他标识符一样由字母、 数字和下划线组成, 但是不能以数字开头. 你可能意味 -T 和 -B 出现的结果必定相反, ... 但是, 有两种特殊情况会让测试结果相同: 如果文件不存在, 两者都会返回假, 因为它既不是文本文件也不是二进制文件; 而在空文件的情况下, 两者都会返回真, 因为它既是空的文本文件又是空的二进制文件. (p.195) 使用栈式写法时, 靠近文件名的测试会先执行, 次序为从右往左. (p.197) Perl 的 chdir 是通过操作系统实现的. (p.204) 任何在命令行上键入的模式, 都可以作为 (唯一的) 参数交给 glob 处理, 如果要一次匹配多种模式, 可以在参数中用空格分开各个模式. (p.205) readdir 操作符返回的文件名并不包含路径, 他们只是目录下的文件名而已. 在 Unix 上有个鲜为人知的事实: 某个文件可能你无法读取、 写入、 执行. 其实它根本就是别人的文件, 但你还是可以将它删除. 这是因为删除文件的权限跟文件本身的权限位无关, 它取决于文件所在的目录的权限位. (p.209) 相当成数字来用的字符串, 即使以 0 开头, 不会被解释成八进制数字. 对非空的目录调用, rmdir 操作符会执行失败. (p.217) 习惯上会使用 1 来占个位子. (p.225) 因为性能需要, $a 和 $b 并不是数据项的拷贝, 它们实际上是原始列表的元素的临时化名. 所以, 如果我们改变他们的话, 就会弄乱原始的数据. 千万别这么做, Perl 不支持也不建议这种行为. (p.229) 在 when 里调用某个函数 ... 取反的表达式, 包括取反的正则表达式, 都不会使用智能匹配模式. (p.241) 在 exec 调用之后写的任何代码都无法运行, 除非是编程接管启动过程中的错误: (p.249) 修改从父进程继承的变量并不能影响 shell 或者其他父进行. (p.250) 在 反引号 (``) 中, 请勿使用会读取标准输入的命令. (p.252) eval 其实是一个表达式, ... 因此在块的结束必须要分号. (p.261) 某些哈希键的引号可以省略.
但是有个切片可以工作、 列表却不能的场合. 那就是切片可以被直接内插到字符串总去.
|
请发表评论