• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

【转好文】c程序员学习perl

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C程序员的提示

    Perl结合了多种编程语言的特性,C语言也在其中。PerlC有以下相同之处:

·  1.分号是每个简单语句必需的,换行不能表示语句结束。

·  2.数组下标也是从0开始,Perl中像substr这样的字符串函数也是从0开始计算位置的。

·  3.逗号操作符的作用一样。

·  4.&&||操作符作用一样。
然而,PerlC毕竟是两种完全不同的编程语言,从C转向Perl有很多值得注意的地方。我们在下面详细讨论。

1.变量的类型由它前面的符号确定

    这不是说Perl使用的是匈牙利表示法,而是Perl的特性。 Perl中,$说明变量是一个scalar@表明变量是一个array %说明后面的变量是一个hash。比如:@foo是一个数组,而$foo[0]是数组@foo中第一个元素,@foo[0] 一个数组片段,当然也是数组,但这个片段只有一个元素$foo[0]。如果你数组变量把赋给一个标量,比如:$bar=@foo; 你将得到的是该数组中元素的个数。

2.没必要提前声明一个变量

    C中你每引入一个变量,都要在前面声明它的类型。在Perl中完全没有必要, 你可以在任何时候任意引入新的变量。不过,问题就出来了,你可得当心。如果你不小心敲错一个字母,Perl会把它 当成你新引入的变量,并且自动初始化,有时不会给出任何错误提示,而这显然与你的最初目的不符!所以,最后在每个Perl程序 的前面都加上use strict;,确保perl能对代码进行更严格的检查,就像你使用lint检查C程序那样。

3.没有类型转换

    Perl中的标量类型范围很广,可以是整数,可以是字符串,也可以是浮点数。 你可以很安全地把一个整数默默地转化成相应的字符串。Perl解释器能够理解你的意思,不用担心。但是,这并不是说 任何时候你都可以高枕无忧,把字符串转化成整数时,你确实得下一番功夫。我们在下面将会讨论这个问题。

4.没有字符类型

    Perl中没有char这种类型。

$ch='c';

上面的语句其实是给标量$ch赋了一个字符串值,因为Perl中单引号也能括起字符串(对比单引号和双引号的不同留做练习)。 正因如此,才使得把字符串转化成整数或者浮点数变得稍微麻烦了些。我们可以这样这样处理字符:

@array = split(//, $string);      # each element a single character<?xml:namespace prefix = o />

@array = unpack("C*", $string);   # each element a code point (number)<?xml:namespace prefix = o />

当然也可以使用正则表达式。Perl中也有类似atoi()的函数,叫作POSIX::strtod,在POSIX模块中,使用前应该先包含它。

5./不是整除

    由于Perl中没有整数和浮点数类型的区分,所以当你想按照C的意思用/操作符 表示整除时,它并非你想要的。实际上/Perl中是浮点除法,下面的程序是危险的:

while($a/=2)<?xml:namespace prefix = o />

{<?xml:namespace prefix = o />

push @tmp, $a % 2;<?xml:namespace prefix = o />

}<?xml:namespace prefix = o />

它会把$a精确地除到小得Perl无法表示它!如果你想表示整除,请将整个表达式放入int函数中。

6.再谈数组

    当心:在Perl中只有hash是使用{}初始化的,普通数组array是使用 ()进行初始化的!使用{}给普通数组赋值解释器会报错。而且,Perl中的数组是可以任意伸缩的,不存在数组越界问题。 不像CPerl允许有匿名数组/散列/子函数,比如使用匿名数组交换两个变量的值:

($var1, $var2) = ($var2, $var1);

Perl数组脱离了底层特性,而且更加灵活方便。

7.没有switch

    这实在是让C程序员们吃惊,Perl居然没有switch。的确,Perl并不需要switch ,因为switch完全可以用if/elsif/else(注意:是elsif而不是else if)或者?:来代替。Perl中的switch可以这样来写:

SWITCH: {<?xml:namespace prefix = o />

if ($value == 1) { print "One" };<?xml:namespace prefix = o />

if ($value == 2) { print "Two" };<?xml:namespace prefix = o />

if ($value == 3) { print "Three" };<?xml:namespace prefix = o />

if ($value > 3) { print "Unknown" };<?xml:namespace prefix = o />

}<?xml:namespace prefix = o />

#Or like this:<?xml:namespace prefix = o />

SWITCH: {<?xml:namespace prefix = o />

$value == 1 and print "One", last;<?xml:namespace prefix = o />

$value == 2 and print "Two", last;<?xml:namespace prefix = o />

$value == 3 and print "Three", last;<?xml:namespace prefix = o />

print "Unknown";       #default<?xml:namespace prefix = o />

}<?xml:namespace prefix = o />

当然你也可以使用goto,毕竟TMTOWTDIThere's More Than One Way To Do It.)。

8.没有structunion

    如果你决定使用Perl编程,那么你可以完全绕开struct这类东西。union 是更为底层的东西,更不应该出现在Perl中。如果你想用struct实现数据结构,比如单链表,那么在Perl 中你可以选择hashreference。其实hash可以实现很多数据结构,更详细的内容见《Mastering Algorithms with Perl》一书。 如果你想用struct实现class,那么你可以使用Perl中的object。最后,如果你说:我不用struct完成不了这个程序 那你怎么不考虑用C而用Perl呢?

9.没有悬空的else

    Perl中的条件和循环语句块都需要用{}括起来,因此也就不存在悬空的else问题。 记住:块(block)本身就相当于一个只执行一次的循环,因此lastblock也起作用。有点例外的情况是当条件判断出现在一条语句的最后时, 前面没必要加花括号。比如:

if $test print "yes";    #This one is WRONG!<?xml:namespace prefix = o />

{print "yse"} if $test;  #WRONG again!<?xml:namespace prefix = o />

print "yes" if $test;    #This one is right.<?xml:namespace prefix = o />

10.不一般的do

    doPerl中被赋予三种不同的含义。当它后面是一个block时,它会把后面 块中的语句都执行一遍,并且返回最后一个表达式的值;如果它和while或者until连用,Perl会通过测试 条件来决定执行块中的语句,但是,块中的语句不会被计算在循环之中。所以,使用last/next/redo来控制块是没用的。 当它后面是一个文件名时,它的作用是把名为此的文件包含进来。当它后面是一个子函数时,它是对后面子函数的调用, 但这是一种不推荐使用的方式。

11.没有内存泄漏

    你再也不用担心freemalloc函数造成内存泄漏了,因为在Perl中没有那种函数, 也没有指针,你几乎不用关心内存分配问题。Perl中类似指针的reference,没有底层的那些特性。实际上,在Perl中造成内存泄漏是很罕见的。你再也不用害怕字符串空间不够用,字符串 是否以'\0'结尾这种问题了,Perl中的字符串像 C++中的String类一样方便,就是没有C++重载运算符带来的 连接和比较字符串的实惠(Perl也可以重载运算符,在这里不讨论)。

12.函数参数

    Perl被设计成与自然语言很接近的计算机语言,这也就无怪乎用Perl也能写出诗来了。 函数参数不必都用圆括号括起来。虽然加上圆括号也没什么影响,但是你得知道,不加括号可以让你的程序更易读,更优雅。试比较下面的语句: 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
HowtoinvokeconsoleapplicationinPerl?(Reship)发布时间:2022-07-22
下一篇:
Perl取得一个数组长度发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap