C程序员精通Perl

时间:2019-05-14 16:00:18下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《C程序员精通Perl》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《C程序员精通Perl》。

第一篇:C程序员精通Perl

C程序员精通Perl

本书帮助有C和C++背景的程序员学习和使用Perl语言。

全书共17章,探讨了Perl语言的所有知识要点。既包括C程序员所熟悉的变量、数据结构、控制语句和子程序,又包括C中所没有的报告编写、文本表格操纵、CGI编程以及简单数据库接口,还讲述了如何充分利用CPAN库中广泛的Perl模块库。

本书可作为C和C++程序员学习Perl编程的参考书。对于Perl语言的初学者,本书可以帮助他们了解C和Perl之间可比较、可结合特性。

第二篇:程序员之路──如何学习C语言并精通C语言

程序员之路──如何学习C语言

学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味着你需要经历艰苦的过程。

一、要读就读好书,否则不如不读

所有初学者面临的第一个问题便是:如何选择教材。好的开始是成功的一半,选择一本优秀的教材是事半功倍的关键因素。不幸的是,学校通常会帮你指定一本很差劲的C语言课本;而幸运的是,你还可以再次选择。

大名鼎鼎的谭浩强教授出了一本《C语言程序设计》,据说发行量有超过400万,据我所知,很多学校都会推荐这本书作为C语言课本。虽然本人的名字(谭浩宇)跟教授仅仅一字之差,但我是无比坚定地黑他这本书的。这本书不是写给计算机专业的学生的,而是给那些需要考计算机等级考试的其它专业学生看的。这本书的主要缺点是:例子程序非常不专业,不能教给你程序设计应该掌握的思考方式;程序风格相当地不好,会让你养成乱写代码的恶习;错误太多,曾经有人指出过这本书的上百个错误,其中不乏关键的概念性错误。好了,这本书我也不想说太多了,有兴趣大家可以百度一下:)

Kernighan和Ritchie的《The C Programming Language》(中译名《C程序设计语言》)堪称经典中的经典,不过旧版的很多内容都已过时,和现在的标准C语言相去甚远,大家一定要看最新的版本,否则不如不看。另外,即使是最经典最权威的书,也没有办法面面俱到,所以手边常备一本《C语言参考手册》是十分必要的。《C语言参考手册》就是《C Reference Manual》,是C语言标准的详细描述,包括绝大多数C标准库函数的细节,算得上是最好的标准C语言的工具书。顺便提一句,最新的《C程序设计语言》是根据C89标准修订的,而《C语言参考手册》描述的是C99标准,二者可能会有些出入,建议按照C99标准学习。还有一本《C和指针》,写得也是相当地不错,英文名是《Pointers on C》,特别地强调指针的重要性,算是本书的一个特点吧。不过这本书并不十分适合初学者,如果你曾经学过C语言,有那么一些C语言的基础但又不是很扎实,那么你可以尝试一下这本书。我相信,只要你理解了指针,C语言便不再神秘。

如果你已经啃完了一本C语言教材,想要更进一步,那么有两本书你一定要看。首先是《C Traps and Pitfalls》(中译名《C陷井与缺陷》),很薄的一本小册子,内容非常非常地有趣。要注意一点,这本书是二十多年前写成的,里面提到的很多C语言的缺陷都已被改进,不过能够了解一些历史也不是什么坏事。然后你可以挑战一下《Expert C Programming》(中译名《C专家编程》),书如其名,这本书颇具难度,一旦你仔细读完并能透彻理解,你便可以放心大胆地在简历上写“精通C语言”了。

切记一个原则,不要读自己目前还看不懂的书,那是浪费生命。如果你看不懂,那你一定是缺失了某些必需基础知识。此时,你要仔细分析自己需要补充哪些内容,然后再去书店寻找讲述的这些内容的书籍。把基础知识补充完毕再回头来学习,才会真正的事半功倍。

二、Unix/Linux还是Windows,这是个很大的问题

不同的编程环境会造就出不同思维的程序员。Windows的程序员大多依赖集成开发环境,比如Visual Studio,而Unix程序员更加钟爱Makefile与控制台。显而易见,集成开发环境更容易上手,在Windows上学习C语言,只需要会按几个基本的Visutal C++工具栏按钮就可以开始写Hello, World!了,而在Unix下,你需要一些控制台操作的基本知识。有人也许认为Unix的环境更简洁,但习惯的力量是很大的,大家都很熟悉Windows的基本操作,而为了学习C语言去专门装一个Unix系统,似乎有点不划算。

对于一个只懂得Windows基本操作、连DOS是什么都不知道的新手而言,尽快做一些有趣而有意义的事情才是最重要的。用C语言写一个小程序远比学习ls、cat等命令有趣,况且我们要专注于C语言本身,就不得不暂时忽略一些东西,比如编译链接的过程、Makefile的写法等等等等。

所以我建议初学者应该以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作为主要的学习环境,而且千万不要在IDE的使用技巧上过多纠缠,因为今后你一定要转向Unix环境的。Visual C++ 6.0使用很方便,调试也很直观,但其默认的编译器对C标准的支持并不好,而Dev C++使用gcc编译器,对C99的标准都支持良好。使用顺带提一下,很多大学的C语言课程还在使用Turbo C 2.0作为实验环境,这是相当不可取的,原因其一是TC 2.0对C标准几乎没有支持,其二是TC 2.0编译得到的程序是16位的,这对今后理解32位的程序会造成极大的困扰(当然,用djgpp之类的东西可以使TC 2.0编译出32位程序,不过那过于复杂了)。

等你学完一本C语言的教材,你一定要转向Unix平台继续学习,几乎所有的C语言高级教程都是基于Unix平台的(比如《C专家编程》)。转变的过程是痛苦的,你需要面对的是各种纷繁复杂的命令,完全不同于Windows平台的思考方式,但是这种痛苦是值得的。Unix与C是共生的,Unix的思考方式和习惯更加符合C语言的思考方式和习惯。在Unix下,你可以找到无数优秀的源代码供你尽情阅读,你可以方便地查看某个库函数的联机手册,还可以看到最优秀的代码风格

归结起来就是一句话:初学C语言,建议使用Windows系统和集成开发环境,在准备向“高手”方向努力时,请先转向Unix平台。

三、万事俱备,你就是东风

书已选定,环境配置完成,正所谓万事俱备,只欠你自己的努力了。请从书的前言开始,仔细地阅读手头的教材,很多人看书喜欢直接从第一章开始看,这是错误的做法。前言是作者对整本书的大体介绍,作者一般会告诉你需要什么基础才能够顺利阅读本书,这可以帮助你检验自己的基础知识是否已经具备。看完前言,还要浏览一下目录,了解一下书的整体结构,顺便给自己安排一下学习计划。

学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因。出了书本上有的例子,自己还要“创造”一些例子,比如学习运算符优先级的时候,可以写几个相同的表达式,在不同的位置加上括号,看看有哪些不同的行为,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的书上的例子以及改造之后的例子,还有自己“创造”的例子,都应该仔细地归类保存,并且要在源代码中写上简短的注释,阐述这个例子的意图。

例子之后就是习题了,我建议初学者把所有的习题都独立做一遍,然后对照答案的代码,看看自己的代码有那些不足,再试着修改自己的代码。很多人不重视习题,这是极大的错误,因为作者通常会在习题中说明一些重要的道理,而不是单纯地检验前面的知识。

也许你认为这样学习太慢,其实不然。学得细致就不用走回头路,等你学到后面才发现自己前面没搞清楚,那才是真的得不偿失。一般说来,整本书读完,你应该完成数千行乃至上万行的代码,无论是原封不动照抄书上的,还是自己心血来潮写就的,都是今后继续学习的一笔财富。以我自己举例,阅读《Windows核心编程》时(我只阅读了3/4的内容),除了抄书上的代码,还自己写了很多例子,一共有5574行(用unix下的wc工具统计),时隔多日,我早已记不清Windows的系统编程了,但只要花几分钟翻出以前的代码看看,便会重新了然于胸。所谓好记性不如烂笔头,就是这个道理。

仔细读书、认真抄写源代码、独立完成习题外加更进一步的实验,最后将所有的代码留下,成为自己的经验和财富,绝对的辛苦,也绝对的事半功倍。当然,这种方式只适合学习需要精通的技术,如果不是学习C语言,你还要具体情况具体分析。

写到最后,还有非常非常重要的一点没有提及──代码风格,从最开始学习就必须强迫自己模仿最优秀的代码风格。

第三篇:Perl软件学习心得

Per l 不需要任何特别的文件名字或后缀名,但最好不要使用后缀名

在 Perl 中,注释由# 开始,如果文本的第一行前两个字符是“ #!”,接着的就是执行下面文件的程序。#!行和程序的可移植性相关,需要找到每台机器的存放地点。幸运的是,通常都被放在/usr/bin/perl或/usr/local/bin/perl中。

如果不是这样,则需要找到你自己机器上perl的存放地点,然后使用那个路径。

Perl 中不需要声明变量

Perl 内部没有整数值。程序中的整数被当做等价的浮点数来处理.八进制以 0 开头,十六进制以 0x 开头,二进制 0b 开头。在十六进制中 A 到 F(或者 a 到 f)分别表示 10 到 15.Perl 允许用下划线来分隔61298040283768,因此可以像下面这样书写:61_298_040_283_768加(+),减(-),乘(*),除(/)模数运算符(%)。10%3 的值是 10 除以 3 的余数。两个操作数首先变成它们对应的整数值,如 10.5%3.2 转换为

10%3◆后再计算两个*号表示,如 2**3,表示 2 的 3 次方.由小写的字母 x 表示。这种操作能把操作符左边字符串重复操作符右边数字那么多次。

use warnings一直都需要警告(warning),可以在 #!这一行加上-w,如:#!/usr/bin/perl – w 当程序中包含可能的错误时,可以要求 Perl 警告你

把 use diagnostics 加入程序后通过它可以看到更详细的警告信息

标量变量的名字由一个美圆符号($)后接 Perl 标识符:由字母或下划线开头,后接字母,数字,或者下划线。或者说由字母,数字和下划线组成,但不能由数字开头。大小写是严格区分的。

每一个二元操作符都有一个等价的二元赋值形式:由这个符号后接等号组成。例如,下面两行是等价的:

$fred = $fred + 5;# 没有用二元赋值操作符 $fred+=5;#利用二元赋值操作符 下面的也是等价的: $barney = $barney*3;$barney*=3;上述两例中,变量借助自身而非别的变量来改变自身的值。另一个常用的赋值操作符是字符串连接符号(.);其赋值形式为(.=): $str = str.“”;#$str后接空格 $str.=“”’;#同上

$mean = “ brontosaurus steak”;

$barney = “fred ate a $meal ”;#$barney 现在是“fred ate a brontosaurus steak” $barney = ‘fred ate a’.$meal;#同上

如果一个变量未被赋值,则将使用空值替换$barney = “fred ate a $meat ”;#$barney 现在是“fred ate a ”

在字符串中变量前($符号前)加上反斜线(),变量将不会被内插(替换): $fred = ‘ hello’;

print “ The name is $fred.n”;#打印出美圆符号,变量不会被其值替换 print ‘ The name is $fred’.“ n”;# 同上

花括号({})。用花括号将变量名括起来。或者将字符串分隔成几个部分,再用连接符(.)串起来:

$what = “ brontosaurus steak ”;$n = 3;print “fred ate $n $whats.n”;# 不是 steaks,而是$whats的值 print “fred ate $n ${what}s.n”;# 现在是使用变量$what print “fred ate $n $what”.“ s.n”;#另一种方法

print ‘fred ate ’.$n.‘’.$what.“ s.n ”;#一种复杂的方法

35!= 30+5 #false 35 == 35.0 #true ‘35’eq‘ 35.0’ #false(按照字符串比较)‘fred’ lt ‘barney’ #false ‘fred’ lt ‘free’ #true ‘fred’ eq ‘fred’ #true ‘fred’ eq ‘Fred’ #false ‘’gt ‘’ #true

if($name gt ‘ fred’),print “ ‘ $name’ comes after ‘ fred ’ in sorted order.n”;}else{ print “ ‘ $name’ does not come after ‘ fred’.n”;print “ Maybe it’ s the same string, in fact.n”;}

作为标量值来使用的,Perl 每次从标准输入中读入文本的下一行,将其传给。标准输入可以有很多种;默认的是键盘。中的字符串通常由一个换行符作为结尾。

$text = “ a line of textn”;#也可以由输入 chomp($text);# 去掉换行符(n)。

chomp($text = );#读入,但不含换行符 $text = ;chomp($text);#同上,但用两步完成 $count = 0;while($count < 10){ $count + = 2;print “ count is now $count n ”;#打印出 2 4 6 8 10 }

defined 函数,它将在为undef时返回 false,其余返回 true $madonna = ;I f($defined($madonna)){ print “ The input was $madonna”;} Else { print “ No input available!n”;}

小写的字母 x 表示。这种操作能把操作符左边字符串重复操作符右边数字那么多次: “fred”x 3 # “fredfredfred” 例子2.5将给出换行的事例

数组下标可以是任何能返回数值的表达式。如果其值不为整数,则自动将其转换为小于它的最大整数值:$number = 2.71828;print $fred[$number100]’;#得到‘ bedrock’ , 第 0 个元素 $rocks[-200] = ‘ crystal’;# 严重错误(fatal error!)

数组是由括号括起来并且其元素由逗号分隔开的列表。(1,2,3)# 含有 1,2,3 的列表(1,2,3,)# 同上,最后一个逗号被忽略()# 空列表-0 个元素(1 ..100)# 包含 100 个整数的列表(1 ..5)#同(1,2,3,4,5)(1.7 .. 5 .7)#同上—最小值和最大值被转换成整数(5 ..1)#空列表—..中的左值应小于右值,否则为空(0,2 .. 6,10,12)#同(0,2,3,4,5,6,10,12)($m ..$n)# 由$m 和$n 的值决定(0 .. $#rocks)#上节中有$#rocks 的介绍 用qw表示数组: qw!fred barney betty wilmadino!qw# fred barney betty wilmadino # #有些像注释 qw(fred barney betty wilmadino)qw{fred barney betty wilmadino } qw[fred barney betty wilmadino ] qw @rocks 可以读作“ all of the rocks@rocks = qw / bedrock slate lava /;@tiny =();#空表

@giant = 1..1e5;#包含 100,000 个元素的表

@stuff =(@giant, undef, @giant);#包含 200,001 个元素的表

@rocks = qw / bedrock slate lava /;@tiny =();#空表

@giant = 1..1e5;#包含 100,000 个元素的表

@stuff =(@giant, undef, @giant);#包含 200,001 个元素的表 @copy = @quarry;#将一个数组中的值拷贝的另一个数组中

pop 操作将数组的最后一个元素取出并返回: @array = 5..9;$fred = pop(@array);#$fred得到 9,@array 现在为(5,6,7,8)$barney = pop @array;#$barney gets 8, @array 现在为(5,6,7)pop @array;#@array 现在为(5,6)(7 被丢弃了)

pop 相反的操作是 push,它可以将一个元素(或者一列元素)加在数组的末尾: push(@array,0);#@array 现在为(5,6,0)push @array,8;#@array 现在为(5,6,0,8)push @array,1 ..10;#@array 现在多了 10 个元素 @others =qw/9 0 2 1 0 /;push @array,@others;#@array 现在又多了 5 个元素(共有 19 个)push 的第一个参数或者 pop 的唯一参数必须是数组变量。

unshift和

shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)。下面是一些例子: @array = qw# dinofred barney #;$m = shift(@array);#$m 得到“dino” , @array 现在为(“fred” , “ barney”)$n = shift @array;#$n 得到”fred” , @array 现在为(“ barney”)shift @array;#@array 现在为空

$o = s hift @array;#$o 得到undef, @arry仍为空 unshift(@array,5);#@array 现在为(5)unshift @array,4;#@array 现在为(4,5)@others = 1..3;unshift @array, @others;#array 现在为(1,2,3,4,5)

@rocks = qw{flintstone slate rubble };print “ quartz @rocks limestone n ”;# 输出为 5 种 rocks 由空格分开

$email = “ fred@bedrock.edu”;#错误!将会替换@bedrock $email = “ fred@bedrock.edu”;#正确

$email = ‘ fred@bedrock.edu’;# 另一种方法

只有一个元素的数组的被其值替换的行为和你预期的类似: @fred = qw(hello dolly);$y = 2;$x = “ This is $fred*1+’ s place”;# “ This is dolly’ s place” $x = “ This is $fred[$y-1]’ s place”;# 同上

@fred = qw(eating rocks is wrong);$fred = “ right ”;#我们将打印“ this is right[3] ”

print “ this is $fred[3] n ”;#打印出“ wrong”使用 $fred[3] print “ this is ${fred}[3] n ”;# 打印出“ right”(由花括号分开)print “ this is $fred”.“ [3] n”;#正确(两个字符串,右.分开)print “ this is $fred [3] n”;# 正确(利用反斜线转义)

foreach从列表的第一个元素一直循环执行到最后一个元素,一次迭代一个:

foreach $rock(qw/ bedrock slate lava /){print “ One rock is $rock.n”;#打印出 3 种 rocks

reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回 @fred = 6 ..10;@barney = reverse(@fred);# 得到 10,9,8,7,6 @wilma = reverse 6 .. 10;#同上,没有使用额外的数组 @fred = reverse @fred;#将逆转过的字符串存回去

sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序 @rocks = qw/ bedrock slate rubble granite /;@sorted = sort(@rocks);#得到 bedrock, granite, rubble, slate @back = reverse sort @rocks;#为 slate 到 bedrock @rocks = sort @rocks;#将排序的值写回@rocks @numbers = sort 97 .. 102;# 得到 100,101,102,97,98,99

标量和列表上下文

+ something #something 必须是标量 sort something #something 必须是列表

如果 something 是相同的字符串,在一种情况下,它返回一个变量值,在另一种情况下,它可能返回列表◆。Perl 中的表达式将根据其 context 返回适当的值。

在列表 context 中,它返回反转的列表。在标量 context 中,返回反转的字符串(或者将反转的结果串成一个字符串):

@backwards = reverse qw / yabbadabba doo /;# 返回 doo, dabba, yabba $backwards = reverse qw/ yabbadabba doo /;# 返回oodabbadabbay

函数 scalar它不是一个真实的函数因为其仅是告诉 Perl 提供一个标量 context: @rocks = qw(talc quartz jade obsidian);print “ How many rocks do you have?n”;

print “ I have ” , @rocks, “rocks!n”;# 错误,输出 rocks 的名字 print “ I have ” , scalar @rocks, “ rocks!n ”;#正确,输出其数字

在标量 context 中返回输入的下一行。

@lines = ;#将输入读入列表 context 中,输入来源于一个文件时,它将读入文件的剩余部分。Unix 或者类似的系统中,包括linux, Mac OS X,通常可以输入 CTRL +D◆来表明输入已经结束。在 DOS/WINDOWS 系统中,使用 CTRL +Z◆。

所有的 Perl 子程序都会返回值,在 Perl 中返回值和不返回值是没有区别的。当 Perl 遍历此子程序时,将会计算每一步的值。此子程序中最后计算的值将被返回。最后一个被计算的表达式是 print 语句。其返回值通常为 1。用my创建私有变量。使用 my 创建新的,私有数组:my @phone_number。sub max { my($m,$n);#新的,私有变量($m,$n)= @_;#赋值 if($m > $n){$m} else{$n} } my($m,$n)= @_;

hash看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签(key)访问此标签对应的元素(value)$hash{$some_key} $family_name, “ fred”= “ rubble”;

$family_name{“fred” } = “astaire”;# 将新值赋给已经存在的元素

$family_name{ “wilma” } = “flintstone”;#新增一个 key(也包括 value)$family_name{ “ betty” }.= $family_name{“ barney ” };#创建一个新元素 $grantie = $family_name{“larry” };#没有larry:得到undef %some_hash =(“foo”, 35, “bar”, 12.4, 2.5, “hello”, “wilma”, 1.72e30, “betty”, “bye n”);@array_array = %some_hash;%new_hash = %old_hash;将%old_hash展开成 key/value 的列表,再将其赋给%new_hash,其将 key/value 对一个一个加入的。%inverse_hash = reverse %any_hash;

my %last_name =(“fred” => “flintstone”, “dino” =>undef,“barney”=> “rubble”;“betty”=> “rubble”,);上面代码中,很容易辨别出哪一个是 key,哪一个是 value。注意列表中最后一个逗号

my %hash =(“a” =>1, “ b”=>2, “ c ”=>3);my @k = keys %hash;my @v = values %hash;

my $count = keys %hash;#得到 3,是指有 3 个 key/value 对。

each 函数,它将返回 key/value 对的2元素列表。一般只在 while 循环中使用 each: while(($key, $value)= each %hash){ print “ $key => $valuen”;

}while 循环的条件表达式,这是在标量 context 中。列表赋值语句在标量 context 中返回的是元素的个数,在本例中,是2。

each 返回的 key/vlaue对,顺序是混乱的(它其顺序和 keys 和 values 函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用 sort),大致如下: foreach $key(sort keys %hash){ $value =$hass{$key};print “ $key => $valuen”;

#也可以不使用额外的临时变量$value #print “ $key => $hash,key-n”;}

exists 函数,如果 hash 中存在此 key,则返回 true,这和 是否有对应的 value 无关: if(exists $books{$dino}){ print “ Hey, there’ s a libaray card for dino!n ”;}

delete 函数将某个给定的 key(包括其对应的 value)从 hash 中删除。(如果不存在这个 key,则什么也不做;不会有警告或者错误信息。)my $person = “ betty”;

delete $books{$person};#将$person 的借书卡删除掉

在双引号的字符串中使用单个 hash 元素: foreach $person(sort keys %books){ if($books{$person}){ print “ $person has $books{$person} items n ” #fred有3个 } }

正则表达式,在 Perl 中通常被称为模式(pattern):某个模板是否匹配某个字符串.某个给定的模式将这些字符串分成两类:一类是能匹配的,一类是不能匹配的。

要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间,如下: $_ = “ yabbadabba doo”;if(/abba/){ print “ It matched!n”;

}模式匹配通常返回 true 或 false,因此经常用在 if 或 while 的条件表达式部分

引入特殊字符的原因,它们被叫做元字符(metacharacters),在正则表达式中具有特殊的含义。点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(“ n ”)。因此,模式/bet.y/将匹配 betty。同时也匹配betsy ,bet=y , bet.y,或者说任意字符串后接 bet, 然后是任意的单个字符(不包括换行符),后接 y。如果只希望点(.)匹配句号,可以使用反斜线。这条规则对 Perl 正则表达式中所有元字符均有效:元字符前使用反斜线将使它变成普通的字符。反斜线是第二个元字符。如果需要真正的反斜线,需要重复使用两个反斜线。

星号(*)表示匹配前一项0次或者多次。.* 将匹配任意多个任意字符(不含换行符)的字符串。加(+)的意思是可以匹配前面一项的一个或多个。问号(?),其含义是前面一个项出现一次,或者不出现。括号(())用来表示分组。例如,模式/fred+/ 能匹配上如fredddddddd,这样的字符串,但这种字符串在实际中没有什么用途。模式/(fred)+/能匹配上像fredfredfred这样的字符串。

竖线(|),在这种用法中通常被读作“或(or)”,意思是匹配左边的或者右边的。

字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。它匹配一个字符,但这个字符可以是列中的任意一个。字符类前使用符号^将取此字符类的补集。也就是说,[ ^def ]]将匹配上这三个字符中之外的任意单个字符。[^n-z]将匹配上 n,-, z 之外的任何字符。

任何数字的类,[0-9],可以被简写为:d。w 被称作“ word’字符:[A-Za-z0-9_]。

s 对于匹配空白(whitespace)将非常方便。它等价于[ f tnr ],其含 5 个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。使用[^ d] , [^ w], 和[^ s],其含义分别是,非数字的字符,非 word(记住我们对 word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:D, W, S 来完成。[ dD],它的意思是任何数字,和任何非数字,则意指任何字符。

不区分大小写:/I匹配 FRED 时,也能匹配上fred, Fred,可以使用修饰符 /i: print “ Would you like to play a game? ”;chomp($_ = );if(/yes/i){#大小写无关

print “ In that case, I recommend that you go bowling.n”;}

匹配任何字符:/s

b,是针对单词使用的。如/bfred b/可以匹配上单词fred,但不能匹配frederick

符号^(脱字字符◆)表示在字符串的开头进行匹配,而符号$则表示在结尾◆

只想要一个词界锚定,当使用 / bhunt/ 将匹配上像 hunt , hunting , hunter,这样的单词,但不会匹配 shunt,而/stoneb/ 将匹配 sandstone, flintstone,而不能匹配上 capstones。非词界锚定为B。它将在任何非b 匹配的点上进行匹配。因此,模式/bsearchB/将匹配 searches , searching, searched , 但不能匹配 search,或者 researching。

匹配上的那部分字符串将自动存储在$&之中。$`中含有正则表达式引擎在匹配成功前所找到的变量,而$'为此模式还没有匹配的剩余部分。

花括号({}),花括号中有 2 个数字,由逗号隔开,表示前面一项允许重复的次数。模式/a{5,15}/将匹配 5 个到 15 个 a 中的任意一个(包括 5,和 15)。星号(*)等同于{0,},表示 0 个或多个。加号(+)等同于{1,},表示 1 个或多个。而问号(?)则等同于{0,1}。

1.在此优先级表的最顶端是括号:(()),在分组和引用内存值的时候使用。括号内部的任何部分比括号外的部分结合更紧 密。

2.第二级是数量词。这里有星号(*), 加号(+),问号(?)以及由花括号表示的数量词,如{5,15}, {3, }, {5}等。它们通常 和前一项元素结合。3.第三级的是锚定和序列(sequence)。锚定包括(^)表明字符串的开头,($)表明结尾,(b)词界符,(B)非词界符。序列(一

个元素紧接着一个元素)实际上是一种操作,虽然它没有使用元字符。这段话的含义是一个单词中的字母结合更紧密,就 像锚定紧贴字母一样。

4.优先级最低的是竖线(|),表示或。由于其优先级最低,它通常将模式划分成几个部分。它在优先级最底端是因为我们希

望像|/fred|barney/ 里面的字母比或(|)结合更紧密。如果或(|)的优先级比序列的优先级更高, 那么,上述模式的含义是匹配fre, 接着是 d 或者 b , 然后是arney。因此,或(|)的优先级最低,字母序列的优先级要高些。s ///操作的则类似于“查询并替换(search and replace)”。它将替换变量中◆模式所匹配上的部分:$_ = “ He’ s out bowling with Barney tonight.”;s/Barney/Fred/;#Barney 被 Fred 替换掉 print “ $_n”;

如果没有匹配上,则什么也不会发生,此变量也不会有任何更改:s/// 会返回一个 Boolean 值。如果成功替换则返回 true ;否则返回 false。

修饰符/g 要求 s/// 将不相重叠◆的所有匹配上的部分都进行替换: $_ = “home, sweet home!”;s/home/cave/g;print “ $_n”;# “ cave, sweet cave!”;

全局替换的一个常用地方是将多个空格用单个空格替换掉:

$_ = “ Input data t may hav e extra whitespace.”;s/s+/ /g;#现在是“ Input data may have extra whitespace.”

s/^s+//;#将开头的空白去掉 s/s+$//;#将结尾的空白去掉

除了/g 修饰符外◆,替换操作中还可以使用/i , /x, 和 /s,这些在普通的模式匹配中已经出现过的修饰符。

U 要求紧接着的均是大写: $_ = “ I saw Barney with Fred.”;

s/(fred|barney)/U$1/gi;#$_ 现在是“ I saw BARNEY with FRED.”

要求后面的均为小写:L:

s/(fred)|barney/L$1/gi;#$_现在是“ I saw barney with fred.”

split,它根据某个模式将字符串分割开。这对于由制表符分割开,冒号分割开,空白分割 开,或者任意字符分割开的数据是非常有用的◆。任何可在正则表达式之中(通常,是一个简单的正则表达式)指定分离符(separator)的地方,均可用 split。@fields = split /separtor/, $string;split◆将模式同字符串进行比较,将由分离符所分隔开的子串作为列表返回回来 @fields = split /:/, “abc:def:g:h”;#返回(“abc” , “def” , “ g” , “ h”)可能得到空的元素,如果其中有两个分隔符是连在一起的:

@fields = split /:/, “abc:def::g:h”;#得到(“abc” , “def” , “” , “ g” , “ h”)这里有一条规则:开头的空元素会被返回,但结尾的空元素被丢弃◆空白/ s+/这个模式进行分割是非常常见的。在这个模式下,所有的空白等价于单个空格: my $some_input = “ This is a t test.n”;

my @args = split /s+/, $some_input;#(“ This ” , “ is” , “ a ” , “ test.”)默认时,split 对$_操作,模式为空白: my @fields = split;#同 split / s+/, $_;

join 函数将这些分割的部分组合成一个整体。join 函数类似于: my $result = join $glue, @pieces;join 函数的第一个参数是粘合元素(glue),它可以是任意字符串 my $x = join “ :” , 4, 6, 8, 10, 12;#$x 为“ 4:6:8:10:12”

在fred and barney went bowling last night 上使用/fred.+barney/ 进行匹配.+,它将匹配除了换行符之外的任意字符,次数大于等于一。但,由于加号(+)是贪婪的;它将尽可能的进行匹配。因此,它将匹配剩余的所有字符串

在fred and barney went bowling last night 上使用/fred.+?barney/ 进行匹配 不是使用加号(+), 而是使用非贪婪的数量词 +?,它将匹配一次或 多次(加号的意思),但其匹配尽可能少的次数,而非尽可能多的次数

第四篇:Java从入门到精通读书笔记—c++程序员学java

Java从入门到精通读书笔记—c++程序员学java

第一章:

2分钟看完,老生常谈,即使没怎么用过java也知道这些。

第二章:

1.instanceof应该是c++中没有的,c++使用RTTI解决这个问题的,很难用。

2.super这种引用父类的方法也是比较简单的,C++中是用父类名::父类方法()解决的,有点难看。

3.自动类型转换和C++一样,精度变高的随便转,精度变低的会丢失。

4.强制类型转换只有(type)这一种,不像c++有static_cast、dynamic_cast、reinterpret_cast、和const_cast。

5.运算符什么的和c++几乎一模一样。

半小时看完。

第三章:

1.break可以跳出语句块,c++中没有语句块。语句块的定义就是在一段语句前加上花括号和冒号;

其他基本上和c++一样,5分钟看完。

第四章:

1.java数组越界会在运行时抛异常,c++不会,声明数组的方法也有些不一致。

java 声明数组的所有办法

int[] a = new int[4];

int a[] = new int[4];

int[] a = {1, 15, 26};

int a[] = {1, 15, 26};

2.java的数组是一个对象,自带length属性,使用简单。c++的数组不自带方法和属性,要知道数组长度只能sizeof(arrayObject)/sizeof(int)。当然如果使用STL中的vector之类的也和java一样简单。

3.java的所谓数组赋值(或者叫数组拷贝)其实就是c++中的两个数组指针的赋值,java没有指针,所以作者费了一大堆口水。好在java有垃圾回收,要不然一个指针的内存就算泄露了。至于真正的数组内容赋值,是使用System.arraycopy(ir, srcPos, ir, destPos, length);而C++一般使用memcpy等函数。若使用STL中的vector,那么就看vector的拷贝构造函数怎么写的,应该是vector的对象赋值过去而不是指针指过去。

4.重温了冒泡排序(时间复杂度O(n2)),和快速排序(最坏情况的时间复杂度为O(n2),最好情况时间复杂度为O(nlog2n))。

5.For-Each语法被引入java了,在很多地方用起来真是简单。Python和c#早就支持了,c++中虽然STL的algorithm包中引入了for_each,但是由于需要使用函数指针还是略显繁琐。

这章挺多,看了一个多小时啊!

第五章:类和对象

1.Java中方法的重载和c++的一样,都是通过参数的不同来区别。但是c++中可以设置默认参数,而java不可以。

2.java中的对象大部分只能new出来,或者clone出来,或者反射出来,而不能直接在栈上定义出来。而c++的对象在栈上和堆上创建的都很多。

3.基本类型的参数传递,java和c++都是传值。对象的参数传递,java是传引用,c++是拷贝,也就是传值。其实c++中大部分时候也是传引用或者传指针,但java没有指针,也没有选择耗时耗空间的拷贝,只能传引用了。

这章对于c++程序员来说太简单,几分钟过一遍就可以了。

第六章:继承

1.方法被覆写后,如果要调用父类的方法,c++必须用父类名::方法名,而java用super.方法名即可。

2.多态和动态绑定,java和c++几乎一样,都很简单。

3.final关键字:java中的final关键字可以将一个类限制为无法继承的,同样的还有C#中的sealed关键字。而c++是没有这个玩意的。

4.java的抽象类和c++几乎一样。

5.java是独根语言,引入了Object类,它的clone方法就好像c++中的拷贝构造函数,它的equals方法是用来比较内容的,而toString方法是将对象作为字符串输出的。

这章对于c++程序员来说同样简单,几分钟过一遍就可以了。

第七章:接口

1.java中有接口。C++没有,唯一类似的是含有纯虚函数的虚类(没有纯虚基类这个说法)。但是COM、CORBA等中间件中都有IDL语言(接口定义语言),使用这些中间件的c++程序员也没有少写接口。

2.接口实现的一些规定:

1)如果实现接口的不是抽象类,则必须实现其接口的所有方法才能被实例化;

2)接口中所有的方法默认为public;

3.接口可以用来实现多态;

4.java的内部类和c++差不多,都没人关心,最多懒得想名字的时候用用那个匿名内部类(例如什么UI的响应函数)。

5.java的对象克隆,吹了一堆就是个c++中的拷贝构造函数。所谓什么“浅克隆、深克隆”问题,就是c++中拷贝构造是遇上类中定义了指针的问题。C++程序员一望即知。

接口是为了维护单继承机制弄出来的,花半小时看看还是值得的。

第八章:面向对象编程

C++程序员不用看。

第九章:异常处理

1.java的异常处理中有finally语句块,而c++中没有,所以程序员要自己想办法来处理异常发生后诸如“资源释放”之类的问题;

第十章:线程

1.java语言自带线程机制,c++目前还是不带线程机制的。虽然boost::thread库也被众多c++程序员广泛使用。但是windows下用得最多的还是windows SDK自带的线程函数;而linux下用得最多的还是pthread。另外还有一些号称同时支持多个平台的多线程库。

2.java多线程有两种方法实现,第一是派生Thread类,第二种是实现Runnable接口。

3.java线程分为4种状态:new、runnable、non runnable和done,这和其他线程库大同小异;

4.run、start、stop、sleep、suspend、resume、yield、wait、notify和notifyall等方法的含义也和其他线程库一致。但suspend、resume和stop等方法是不建议使用的,因为可能会导致死锁。

5.java可使用join方法来等待线程结束,而在某些线程库中join方法经常是不可用的。

6.java的互斥使用synchonized关键字实现,它很类似于boost.thread中的lock(mutex),只不过它是对线程对象隐含的锁加锁。其实这很不利于新手理解。另外还介绍了synchonized的一些乱七八糟的用法,相信对于新手这只有反作用。

这一章对于线程,介绍得比较浅显,实现简单的多线程应该没问题,但是稍微复杂一点的也许就需要其他的开发包了。Java线程连个Mutex类都没有,这是最让我吃惊的,仅仅使用synchonized来实现同步、互斥、信号量该多麻烦啊,也许是我还没弄懂java多线程吧。

第十一章:图形编程

1.IDE的年代,GUI还是画出来吧。Java中也就Layout类需要看看,其他大部分Layout类也是凑数的,根本不会有人用。

第十二章:事件处理

随便看看了解即可,新手可以试着写写代码,老手直接IDE中添加事件即可。

第十三章:Swing用户界面设计

同第十一章,随便看看即可。界面一般有专人搞,普通程序员能看懂就行了。

总结:《java从入门到精通》这本书整体质量尚可,c++熟手大概一到两天可以看完,掌握程度在80%左右。看完后能够有一些基本概念,可以写一些基本程序。看完后离入门还早,更谈不上精通了。

说说我看完后的两个迷惑之处吧,第一是从来没有提到java中的对象、常量、代码所在的堆、栈等内存分布情况,对于c++程序员来说是很难适应的,可能是篇幅的原因吧;第二没有介绍垃圾回收机制,这可能是c++程序员更感兴趣的吧。

第五篇:成都软件技术培训学校哪家好?做Java程序员的Perl教程

国信安教育基地 www.xiexiebang.com

成都软件技术培训学校哪家好?做Java程序员的Perl教程

成都国信安软件技术培训由副教学总监,优秀讲师带队并亲自授课,秉承成都国信安一贯的专业品质态度,在课程质量,学生素质,就业服务上相当严格要求,并以学业满意就业为目标,打造国内优秀软件技术培训班,感兴趣的同学不妨关注国信安教育基地了解一下吧。

为什么越来越多的90后偏爱互联网行业呢?他们的择业观与80后有哪些区别呢?

在公司内部,90后更偏爱自由开放的企业文化。从调查结果来看,有73%的受访者赞同“开放自由、相对宽松”是最理想的企业文化,仅有13%的受访者可以接受“严格守序、集体高于个人的传统企业文化”。在追求自由的风格影响下,大部分90后都明确表示反感办公室八卦和职场潜规则。

每一代人都有自己的择业观——70后追求稳定“铁饭碗”;80后奉行实用主义,看重职业发展;而90后爱高薪更爱自由。波士顿咨询公司的最新分析报告显示,2014年互联网行业在中国直接创造了170万个就业机会。随着行业的进一步发展,预计2020年有望直接为约350万人带来就业机会。短短几年间,蓬勃发展的互联网公司已经成为深受90后青睐的就业选择。很多90后之所以热衷在互联网企业就业,与行业广阔的发展空间、人性化的管理风格以及诱人的薪酬福利有着密切关系。

四川是旅游的天堂,无法拒绝她火辣辣的美食,无法拒绝她惊艳的自然风光,更无法拒绝她的古蜀文化。有的同学因高考落榜而黯然神伤,不知道出路在哪里?首先需要说明,高考落榜是个普遍问题,读大学不是人生的唯一出路,条条大道通罗马,不上普通大学人生更很精彩。君不见,大学生就业形势严峻,大学生毕业即失业。一边是大学生求职难,一方面是企业技能人才用人荒,此现象可谓冰火两重天。许多人观念正在悄然转变,读大学不如学技术。学习的目的是就业,有个美好未来。作为高薪行业,IT行业一直是年轻人求职的首选。互联网行业以其超过百万的人才缺口和长效的职业发展期而倍受青睐。未来人们对互联网的运用需求仍将持续不断上升。因而,对于那些对互联网新兴事物感兴趣的学生而言,选择IT行业,是绝佳的选择。

在日常生活中,大家都多多少少听说过IT培训,那么各位对其了解又有多少呢?是不是哪个更靠谱是大家比较关心的问题?接下来就让小编带你来看看IT培训相关的情况吧~请看下文~ 国信安教育基地 www.xiexiebang.com

Java教程中一般讲解的都是Java的知识,本次给大家讲的是Perl教程,因为作为一个Java程序员在工作中都会用带

Perl.下面给大家讲解Java教程-作为Java开发人员如何快速学习Perl。

1.从基础开始

不像java,Perl不需要“main”方法作为入口点。要运行一个简单的Perl程序如下:

# comment starts wITh “#” # the name is hello.pl print “Hello Perl!”;

perl hello.pl

2.日期类型

在Perl中的日期类型是非常简单,它有3种类型:标量,数组和Hash。标是一个单值,它基本上可以是任何其他比数组或哈希。数组是一个数组,可以包含不同类型的元素,如整数,字符串。哈希基本上是像Java的HashMap中。将下面的代码结合所有的使用情况。国信安教育基地 www.xiexiebang.com

#claim a hash and assign some values my %aHash;$aHash{'a'}=0;$aHash{'b'}=1;$aHash{'c'}=2;$aHash{'d'}=3;$aHash{'e'}=4;

#put all keys to an array my @anArray = keys(%aHash);

#loop array and output each scalar foreach my $aScalar(@anArray){ print $aScalar.“n”;}

输出结果: e c a b d

如果你想对数组进行排序,你可以简单地使用类似下面的排序功能:

foreach my $aScalar(sort @anArray){ print $aScalar.“n”;}

3.条件、循环表达式

Perl为条件和循环语句准备了if, while, for, foreach等关键字,这与Java非常类似(swITch除外)。详情请见下面的代码:

#if my $condITion = 0;if($condITion == 0){ print “=0n”;} elsif($condITion == 1){ print “=1n”;} else{ 国信安教育基地 www.xiexiebang.com

print “othersn”;}

#while while($condITion < 5){ print $condITion;$condITion++;} for(my $i=0;$i< 5;$i++){ print $i;}

#foreach my @anArray =(“a”, 1, 'c');foreach my $aScalar(sort @anArray){ print $aScalar.“n”;}

4.文件的读写

下面这个例子向我们展示了如何读写文件。这里请注意“>”和“>>”之间的区别,“>>”在文件末尾追加内容,“>”创建一个新的文件储存信息。

#read from a file my $file = “input.txt”;open(my $fh, “ $file!”;while(my $aline =){ #chomp so no new line character chomp($aline);print $aline;}

close $fh;

# wrITe to a file my $output = “output.txt”;open(my $fhOutput, “>”, $output)or die(“Error:

Cannot open $output file!”);print $fhOutput “something”;close $fhOutput;国信安教育基地 www.xiexiebang.com

5.正则表达式

Perl中有两种使用正则表达式的方法:m和s。下面的代码在$str上应用了正则表达式。如果$str的内容是“programcreek”,表达式将会返回true。这也可以被用于条件判断或循环。

$str =~ m/program(creek|river)/

6.传值/引用的语法

在Perl中没有必要定义方法/函数,但如果你这么做了,那将大大提高代码的模块化和可充用性。但我们需要对参数的传递非常小心。你可以直接传递一个标量,但如果传递的是数组或哈希类就需要特别的当心。

数组:

my @testArray =(1, 3, 2);

#In sub sub processArrayByReference($){ my $arrayref = shift;my @array

= @$arrayref;#...}

#In sub processarray: sub processArrayByValue($){ my @array = @_;#...}

processArrayByValue(@testArray);processArrayByReference(@testArray);

哈系类:

sub printHash($){ my %hash = %{ shift()};for my $key(sort keys %hash){ my $value = $hash{$key};print “$key => $valuen”;} }

printHash(%twoLettersCount);国信安教育基地 www.xiexiebang.com

7.一些实例

1).遍历字符串中的每个字符。

my @lineCharArray = splIT('',$aline);foreach my $character(@lineCharArray){ print $character.“n”;}

2).创建一个包含26个字母的数组。my @charArray =('a'..'z');my @twoCharArray =('aa'..'zz');

你可以简单地实现这个功能并且无需循环26次。

从Java教程中,不能单单的了解Java的知识,在工作中能用到的知识都应该去学习并熟练应用,这样才能在工作中更加出色。

国信安IT培训基地专注java培训、php培训、UI设计培训、软件测试培训、大数据培训、web前端培训等培训课程。你们准备好怎么学习IT技术了吗?来参加国信安IT培训课程,你的选择不会有错!

下载C程序员精通Perlword格式文档
下载C程序员精通Perl.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    成都Java培训机构哪家好?做Java程序员的Perl教程(合集5篇)

    国信安教育基地 www.xiexiebang.com 成都Java培训机构哪家好?做Java程序员的Perl教程 成都国信安java培训由副教学总监,优秀讲师带队并亲自授课,秉承成都国信安一贯的专业品......

    黑马程序员:轻松精通Java学习路线连载1-基础篇!

    黑马程序员:轻松精通Java学习路线基础篇 编程语言Java,已经21岁了。从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind......

    成都java培训学校哪家好?没有基础做Java程序员的Perl教程(共五则范文)

    国信安教育基地 www.xiexiebang.com 成都java培训学校哪家好?没有基础做Java程序员的Perl教程 成都国信安java培训由副教学总监,优秀讲师带队并亲自授课,秉承成都国信安一贯......

    法学精通书单

    目 录 1、法理学 2、宪法 3、民法(包括:人格权法、合同法、物权法、侵权责任法) 4、知识产权法(包括:著作权法、商标法、专利法) 5、商法(包括:公司法、金融法、担保法、破产法) 6、......

    2013精通中考语文

    2013精通中考语文 一、积累与运用(26分) 1、填补下列名句的空缺处或按要求填空。(每空1分,共8分) 安得广厦千万间,_________________。 ____________________,燕然未勒......

    程序员(范文模版)

    作业:研究一个新或自己感兴趣的职业 v介绍:名称定义 v典型生涯路径:从新手到最高职位的生涯路径 v趋势:技术、组织结构、培训、经济趋势对职业的影响v薪酬:差别、地域差别v所......

    程序员

    7.5.3系统测试和调试 1.系统测试的意义及目的 系统测试是为了发现错误而执行程序的过程,成功的测试是发现了至今尚未发现的错误的测试。 测试的目的就是希望能以最少的人力和时......

    程序员

    程序员之死 程序员:举世至主,万元之源,众物所幕,神祗皆掌,岁能长立,箜有己出。弈中悲苦,是自了得!幸事祸事飘忽于其思想,晓如今,心思想,新纪元,心结缘,把话晾。 世间万物,出于思想,毁亦思想......