|
目录 篇名 概述 我能拿到 Perl的 BNF/yacc/RE吗? $@%*这些符号是什麽意思?我怎麽知道何时该使用他们呢? 字串加引号或使用分号及逗号是否绝对必要/还是完全没必要? 我如何跳过一些传回值? 我如何暂时滤掉警告讯息? 什麽是一个扩充 (extension)? 为何 Perl运算子的优先顺序和 C的不一样? 我如何宣告/生成一个资料结构 (structure)? 我如何创造出一个模组 (module)? 我如何创造一个类别 (class)? 我如何辨别一个变数是否被污染了(tainted)? 闭包 (closure)是啥? 何谓变数自杀而我又该如何防止它? 我如何传递/传回一个 {函数,档案把手,阵列,杂凑阵列,方法,和正规表现式}? 我如何生成一个静态变数? 动态与文字式(静态)范围界定 (scoping)有何不同? Local()和 my()呢? 当同一个范围中有一个文字式变数时,我该如何去撷取同名的动态变数? 所谓深连结与浅连结 (deep and shallow binding)间有何不同呢? 为何 "local($foo) = ;"无法正确地作用? 我如何重新定义一个内建函数、运算子或是方法? 用 &foo和 foo()的方式来呼叫一个函数有什麽不同? 我如何作一个 switch或 case叙述? 我如何抓到呼叫未定义变数/函数/方法的事件? 为什麽我的程式会找不到放在同一档案中的方法 (method)呢? 我如何找出目前所在的 package为何? 我如何将一大块 perl程式码变成注解? 作者与版权事宜
--------------------------------------------------------------------------------
篇名 perlfaq7 - Perl语言相关问题 ($(原文版 Revision: 1.18, Date: 1997/04/24 22:44:14 中译版 $Revision: 1.1 $ $Date: 1998/01/16 23:57:56 $)
--------------------------------------------------------------------------------
概述 本篇内的问题主要是不适合纳入其他篇章的一般性 Perl语言问题。
--------------------------------------------------------------------------------
我能拿到 Perl的 BNF/yacc/RE吗? 不行,引用 Chaim Frenkel的话:“Perl的语法无法被简化到可以用 BNF 表示。解析Perl的工作是分散於 yacc、lexer、烟雾和镜子之间。”
--------------------------------------------------------------------------------
$@%*这些符号是什麽意思?我怎麽知道何时该使用他们呢? 他们都是指定形态 (type)用的符号,如同 perldata里所详述的:
$纯量值 (scalar) (数字,字串或参考值 [reference]) @阵列 %杂凑阵列 (关连阵列) *代表同一个变数名的所有类形。在第四版中它们常用来达到指标 (pointers)的功能,但现在在新版的 perl中这个角色已被参 考值 (reference)取代了。
虽然这些符号在某些场合下可省略,但建议你随处都用。
有些其他的符号你可能会碰到但却不是指定形态用的有:
<>这是用来从一个档案把手 (filehandle)里输入一份记录 \取某样东西的参考值 (reference)
注意 < FILE> 不是用来指定档案的形态,亦非此把手的名字。它只是 将<>这个运算子用在 FILE这个把手上。在纯量的情境 (scalar context) 下,它自 FILE 把手一次读入一行 (嗯,该说一笔记录,参看 $/),在序列情境 (list context)下,则一次将 全部的内容读 入。当对档案使用开、关或其它 <>之外的动作、或甚至只是提到把 手时,切记不要使用 <>。下面的用法是正确的:eof(FH) , seek(FH, 0,2) 以及 ``copying from STDIN to FILE''。
--------------------------------------------------------------------------------
字串加引号或使用分号及逗号是否绝对必要/还是完全没必要? 通常一个没有冠上形态符号的字 (bareword)是不需被纳入引号里的,但在大多数 的情况下或许该这麽做 (在use strict下则是必须的)。但由一个简单的字(不 能是一个已定义的副函数之名称)所构成的索引值,和 =>左端的运算子,都会被视为已纳入引号了:
这些是和这些一样的 ------------ --------------- $foo{line} $foo{"line"} bar => stuff "bar" => stuff
一个区块末端的分号可有可无,一个序列的最後一个逗号亦同。良好的写作风格 (参看perlstyle)中建议除了在单行程式 (one-liners)的情况外都将他们加上去:
if ($whoops) { exit 1 } @nums = (1, 2, 3);
if ($whoops) { exit 1; } @lines = ( "There Beren came from mountains cold", "And lost he wandered under leaves", );
--------------------------------------------------------------------------------
我如何跳过一些传回值? 一种方法是将传回值当作序列来对待,然後用索引来指名其中的某个位置:
$dir = (getpwnam($user))[7];
另一种方法就是在等号左端用 undef 作元素:
($dev, $ino, undef, undef, $uid, $gid) = stat($file);
--------------------------------------------------------------------------------
|