【转载】从C到Perl
很多人并不是把Perl当做第一门编程语言来学习的,在学Perl之前往往已 经掌握了一两门其它语言。虽然有争议,但是我个人认为Perl确实不适合作为入门语言。这篇文章就是写给那些熟悉C而且又想掌握Perl的程序员,介绍一 些技巧以及如何避免C程序员常犯的错误,带你渡过危险的沼泽。在读这篇文章之前,请先查看perltrap的手册页,里面有很多有用的信息,这里不再重 复。欢迎来到Perl的魔法世界!
如果你喜欢C,那你也会爱上Perl。
给C程序员的提示
- 1.分号是每个简单语句必需的,换行不能表示语句结束。
- 2.数组下标也是从0开始,Perl中像substr这样的字符串函数也是从0开始计算位置的。
- 3.逗号操作符的作用一样。
- 4.&&和||操作符作用一样。
然而,Perl和C毕竟是两种完全不同的编程语言,从C转向Perl有很多值得注意的地方。我们在下面详细讨论。
1.变量的类型由它前面的符号确定
2.没必要提前声明一个变量
3.没有类型转换
4.没有字符类型
$ch='c';
上面的语句其实是给标量$ch赋了一个字符串值,因为Perl中单引号也能括起字符串(对比单引号和双引号的不同留做练习)。正因如此,才使得把字符串转化成整数或者浮点数变得稍微麻烦了些。我们可以这样这样处理字符:
@array = split(//, $string); # each element a single character @array = unpack("C*", $string); # each element a code point (number)
当然也可以使用正则表达式。Perl中也有类似atoi()的函数,叫作POSIX::strtod,在POSIX模块中,使用前应该先包含它。
5./不是整除
while($a/=2) { push @tmp, $a % 2; }
它会把$a精确地除到小得Perl无法表示它!如果你想表示整除,请将整个表达式放入int函数中。
6.再谈数组
($var1, $var2) = ($var2, $var1);
Perl数组脱离了底层特性,而且更加灵活方便。
7.没有switch
SWITCH: {
if ($value == 1) { print "One" };
if ($value == 2) { print "Two" };
if ($value == 3) { print "Three" };
if ($value > 3) { print "Unknown" };
}
#Or like this:
SWITCH: {
$value == 1 and print "One", last;
$value == 2 and print "Two", last;
$value == 3 and print "Three", last;
print "Unknown"; #default
}
当然你也可以使用goto,毕竟TMTOWTDI(There's More Than One Way To Do It.)。
- //这里有问题,因为7在5.8中实现,而且很强大.是用模块来实现的
8.没有struct和union
如果你决定使用Perl编程,那么你可以完全绕开struct这类东西。union 是更为底层的东西,更不应该出现在Perl中。如果你想用struct实现数据结构,比如单链表,那么在Perl 中你可以选择hash和reference。其实hash可以实现很多数据结构,更详细的内容见《Mastering Algorithms with Perl》一书。如果你想用struct实现class,那么你可以使用Perl中的object。最后,如果你说:“我不用struct完成不了这个程序”,那你怎么不考虑用C而用Perl呢?
9.没有悬空的else
if $test print "yes"; #This one is WRONG! {print "yse"} if $test; #WRONG again! print "yes" if $test; #This one is right.
10.不一般的do
11.没有内存泄漏
12.函数参数
open (YOUREYES, $wide) or die ("$!");
open YOUREYES, $wide or die $!;
这是Perl,放轻松点儿。更进一步,如果你不想转递给函数任何参数,不用带多余的圆括号;但是如果你也想同样处理你自己写的子函数,你必须在使用之前就定义或者声明那个函数。
此外,Perl很好地支持可变参数,而且Perl传递函数参数实际上是引用传递,而不是像C那样采用值传递!换句话说,你对@_中的元素进行修改,那么相应的实参也会变化。Perl采用这种方法可以很容易地返回所需要的值。
13.函数原型
14.没有main函数
15.不一样的左值
Perl中所有可能是左值的东西都可以作为左值。比如,如果?:操作符的两部分表达式都是左值,那么整 个表达式也可以是左值。函数也可以是左值,若substr函数的第一个参数运算后是可修改的,它也可以用作左值。你也可以把自己的子函数定义成可以作为左 值使用的,是的,Perl允许你这么做。就像这样:
my $val; sub canuse : lvalue { $val; } canuse() = 9;
它可以很安全地把右值赋给$var。
16.隐含变量/参数
当然,Perl的魔力和魅力远不止如此。Perl有着自己独特的风格,散发着自己的光芒。你应该用心去寻找Perl中的pearl!愿你也能用Perl创造更多的奇迹,更多的艺术!
参考资料
1.《Programming Perl, Third Edition》
2.《Professional Perl Programming》
3.《Perl Debugged》
4.《The C programming Language, Second Edition》