关于perl 入门的疑惑。

关于perl 入门的疑惑。

关于perl 入门的疑惑。
大家好, 我做了3年从c/c++,java 开发。
最近接触perl . 需要掌握到基本熟练的程度。
有一点觉得不大适应。

主要是关于perl 的标量, 相对与(c,java) 等强类型语言。 类型是确定的。 perl 的 context 上下文,让我感觉很不适应。

基本上掌握高级语言, 大概一个语法, 语言特点, api 的一熟悉过程。

请大家给点关于, 理解 perl 自动上下文的一点意见?
btw . 大家掌握perl 语言一般要多少个月?
其实 perl 是很容易上手的.
其实 perl 是很容易上手的,你做了3年的编程开发,应该更容易上手
熟悉 perl 中的几种变量类型很容易, 标量以 $ 标识符开头就相当于 int,char....之类变量的集合,不管什么类型,丢给他,他自己处理
数组以 @ 标识符开头 ,和 C 里面的 str[..] 一样,只是无需指定数组内元素的类型,也就是数组内的元素随你是什么类型,相同,不同,都随你
散列以 % 标识符开头, %hash 就是一个名为 hash 的散列,元素以键值对的形式存在,赋值的时候
$hash{KEY}=VALUE,也没有类型的限制
还有就是引用,引用变量和标量相同 ,也是 $ 开头,只不过它里面的值不一样,和 C 里的指针概念类似

上下文的话其实不难适应,它能够让程序自动的去根据语法环境来进行处理
比如一个数组 @a=(0..5); # <----- 6个元素,0到5

$v=@a; # 左边变量为标量,标量上下文 , $v 的值是 @a 中元素的个数,所以为 6
@b=@a; # 数组上下文,@b 成了 @a 的一个拷贝
($v)=@a; # 左边为一清单,所以是清单上下文,此时 $v 的值是 @a 中第一个元素 0
%h=@a; # 左边为一哈希表, %h=(0=>1,2=>3,4=>5);

上下文是 perl 中一个比较聪明的地方,他会自动理解操作符和被操作元素之间的关系,比如
if(@a > @b){...}else{...},这里,@a 和 @b 虽然是数组,但是 > 操作符需要的是两个标量作为比较参数,因此在此种语法环境(即标量上下文环境)中,perl 会自动将 @a > @b 的比较理解为 @a 中元素个数和 @b 中元素个数的比较
上下文不难,实际用用即可明白,像学英文一样.你偏要定义它,它就是语法规则,你用用它,积累一些语感,也就都明白了,何况 perl 的上下文远远没有英文语法复杂...

学习 perl,无非就是先熟悉基本的语法,然后可以多了解一下 perl 的 OOP 和 perl 强大的模块库 CPAN
推荐 qiang 的 [url=http://www.perlchina.org/archive/archive.php?action=archive&page=46]Perl学习指南[/url]

perl 入门很快的,写一些程序了解一下,不需要很多时间,甚至一天的时间你就能了解到很多的东西,比java,c/c++ 要容易得多,看着 java 英语作文似的冗长代码就烦... :-P




   

上下文其实就是就相当于函.
上下文其实就是就相当于函数的多态,如果把运算符也当作是函数的话。
给予函数或者运算符不同的上下文,就可以让函数或者运算符有不同的行为。
另一方面,函数或者运算符也可以给它的参数提供上下文,
我之所以说上下文并不复杂,
主要是出于两点:
1,函数、运算符在具体的上下文中,行为是固定的,
因此可以把上下文当作是函数的行为定义的一部分,就好像是多了个参数一样,以 localtime 函数为例:
不带参数的 localtime 函数在标量环境下,返回当前的系统时间串;在列表上下文环境下,返回一个列表 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
那么,我们可以认为,不带参数的 localtime 函数就相当于带有一个 flag 参数的如下伪 C 函数:
RETCODE localtime( int flag );
当 flag == 列表上下文时,返回列表,当 flag == 标量上下文时,返回时间串。
[color=red]上下文就相当于是函数的一个输入参数[/color]

2,上下文之所以简单,第二个原因就是因为上下文是确定的,文档上都有描述,而不像有些对 Perl 一知半解就开始攻击 Perl 的无聊者口中所说的“不可捉摸”一样。
对于初学者,我简要介绍一下 Perl 的上下文的确定原则。
a),上下文是传递的,也就是说,要想确定某个表达式所处的上下文,可能需要先分析同一条语句中其它部分的上下文,这在复合语句中,要更加复杂一些。
b),赋值语句中,等号右边的部分所处的上下文由等号左边的部分决定。
c),while until if unless elsif 语句中,控制条件是在标量上下文中计算的。
d),语句修饰符 while until if unless 和 c) 相同。
e),for 语句的三个语句都在标量上下文中计算。
f),foreach 语句的格式是固定的,括号是必须的,括号内的部分就处于列表上下文。foreach 可以简写成 for,请勿与 e) 搞混。
g),双引号以及 qq 运算符给数组施加“字符串上下文”
h),两个圆括号运算符、作为匿名列表生成器的方括号、作为匿名 hash 生成器的花括号,将给括号内的部分提供列表上下文。
i),提供数组下标的方括号,要稍微复杂些,如果析取的是一个“片段”,那么它给括号里面提供的是列表上下文,如果析取的是单个元素,那么它给括号里面提供的是标量上下文。
j),标准的 Perl 函数,它给它的参数提供的上下文可以通过 perldoc -f <函数名> 来查看,
perldoc 中函数的语法格式中 LIST 对应的参数将处于列表上下文。
k),自定义函数如果不带原型的话,它一律给参数列表中的每个元素都提供列表上下文,如果有原型的话,参数列表中每个元素所处的上下文根据原型来识别。
好了,要睡觉了,就说这些吧。总之一句话,所有的东西都在文档上写得一清二楚的,去看文档吧!有什么不会了,perldoc 一下先,再不会了问问人,没什么难的。
[CCB]1[/CCB]--多谢,楼.
[CCB]1[/CCB]
多谢,楼上各位。 现在感觉好多了.
来转转
大家都是高手,还请多照顾.