设为首页 收藏本站
查看: 923|回复: 0

[经验分享] Learning Perl 4ed Reading Notes

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-26 14:01:42 | 显示全部楼层 |阅读模式
Learning Perl 4ED Reading Notes

Chapter2 Scalar Data
1. Numbers.  所有的数据(int,float)在Perl内部都是double类型。当然,有的时候Perl在内部也会使用integer来表示int,因为这样可以 提高程序的运行速度,但是这些逻辑对于程序员来说都是invisible的,所以,我们完全可以不用关心。

2. Floating-Point and Integer Literals. For example:
1.25
255.0
7.25e45
-12e-24

0
2001
-40

这样的也是可以的:61_344_3434_878, 也是一个integer,用underscore格开纯粹为了可读性好,其实这就是一个integer。为什么这里不用逗号用underscore呢?这是因为逗号在Perl中还有其他用处。

3. 非十进制的数据。如:

0377 -- 八进制,相当于十进制255
0xff -- 十六进制
0b11111111 -- 二进制

只有Literal(常量)能用0x, 0b,  0这样的字符打头来表示非十进制数,如果是一个存放在string里面的十六进制数,那就要用函数来把字符串转换成数字,比如用oct()函数可以 将"0377"转换成八进制数,用hex()函数将string转换成十六进制数。但是没有用于二进制数的转换函数,用oct函数就可以实现,oct函数 可以把0b打头的字符串转换成数字。

4. Numeric Operators. 加减乘除当然是可以用的,此外,和C一样,用%表示取余,和Pascal、C不一样的是,Perl支持**操作符表示指数,比如2**3表示2的三次方,这是Pascal和C没有的。

注意:用%取余的时候,如果两个操作数中有一个是负数,或者两个数都是负数的情况下,不同的Perl实现(Perl解释器)可能会给出不同的答案,Beware!
5. Strings. Strings是一种可以包含任意字符序列的数据类型。除了常见的ASCII32~ASCII126之间这些键盘上可见的字符外,我们完全可以在String中放置任何数据,包括二进制数据。比如可以将一幅图片放到一个String中。

注意:和C不一样的是,Perl依靠字符串的长度来判断String的结尾位置,而不是依靠结尾的\0来判断字符串是否结束。

6. Single-Quoted String Literals and Double-Quoted String Literals.  和其他的语言一样,被括在单引号中的字符串,其中可以使用的东西较少。比如,在单引号覆盖的字符中,引用Perl变量的特殊语法将不会生效,只有在双引号 包含的字符串中才能生效;又如,用backslash  \来转义,在单引号的字符串中,只能用backslash转义两个字符,即\'和\\,前者表示一个单引号,后者表示一个backslash,除此以外, 使用backslash这个字符,就真的表示是一个backslash  character。比如'hello\n'这个字符串表示hello加上一个backslash,最后加上一个n,\n就不会被理解成回车符。使用双引 号就自由多了,用backslash可以转义很多字符,详情见附件1。

7. String Operators. 这里介绍了两个,第一个是.这个符号。和PHP一样,这里的. (a single  dot)表示连接两个字符串,如"hello"."world"就表示"helloworld";第二个operator是x(小写的x字符),这个表示 重复,比如"fred"x3表示"fredfredfred"。这个x的倍数可以写成一个float,此时Perl会自动将这个Float截断成 integer然后操作,比如"fred"x4.8就表示"fred"x4,此外,如果这个倍数小于1的话,那么我们就会得到一个empty(zero- length) string.

8. Automatic Conversion between Numbers and Strings.  在绝大多数情况下,Perl会为我们自动做String和Number之间的类型转换,依据就是看operator,比如+,只有number才能做+的 动作,那么Perl会自动将类型都转换成number,比如遇到.,Perl就会自动将两边的操作对象都当作String处理(这就是为什么Perl不 用+来用作字符串的连接了)。有的时候Perl的自动类型转换会变的非常神奇,比如"12fred34"*3,我们会得到36,即Perl从头开始发现不 是数字的时候将后面的舍弃,"12fred34"被当作12来处理了。如果一个String无法被转换成Number,那么Perl会把它变成0来处理。 自己尝试一下即可。
Learning Perl 4ED Reading Notes

Chapter2 Scalar Data
9. Perl's Built-in Warnings. 本节很有用。首先用perl -w  my_perl_program来执行我们的Perl程序就可以打开所有的warning信息;其次,也可以在我们Perl程序的第一行写成这 样:#!/usr/bin/perl -w,效果也是一样;更有用的是,在Perl程序中写入use  diagnostics;一行代码,可以打开diagnostics信息,比warning信息更详细和全面,查看perldiag的man手册可以发现 更多信息,不过,每次打开和关闭diagnostics信息都要去编辑Perl程序源码,很烦,为此,我们也可以在命令行打开diagnostics信 息,这样:perl -Mdiagnostics my_perl_program,这样的效果和在代码中写use  diagnostics;是一样的,不过这样更自由。

10. Scalar Variables. 本节描述如何定义Perl中的变量,-- 用美元符号 $ ,这和shell编程是一样的,不同的是,shell编程中,引用一个变量的值要用$符号,但是给这个变量赋值的时候不需要使用$符号,而Perl不同,在Perl中,不管是对变量赋值,还是引用变量的值,都需要用$符号--其实这样更符合编程习惯。如:

$fred   = 17;          # give $fred the value of 17
$barney = 'hello';     # give $barney the five-character string 'hello'
$barney = $fred + 3;   # give $barney the current value of $fred plus 3 (20)
$barney = $barney * 2; # $barney is now $barney multiplied by 2 (40)

11. Binary Assignment Operators. Perl和C一样,也支持这样的写法:

$fred += 5;
$barney *= 3;
$str .= " ";   # 效果就是$str = $str . " ";
$fred **= 3;   # $fred = $fred ** 3;  

  
12. Output with print. print这个function在Perl中可用做打印,其实我发现Perl中也可以和C一样的,用printf来打印东西,完全可以不用print:

print "The answer is ";
print 6 * 7;
print ".\n";

上面的也可以这样写,这个时候就发现Perl中的逗号是用在这里的:

print "The answer is ", 6 * 7, ".\n";

13.  在双引号的字符串中可以直接写入变量,这样Perl会用变量的值来代替变量,注意,没有定义的变量会打印成空字符串,而且如果打开了Perl的 warning的话,Perl会抱怨说我们正在引用未定义的变量。如果我们想print一个$符号,直接用backslash转义就OK了。

和shell编程中一样,Perl支持用{}将变量括起来的做法,这样可以显式的定义变量是哪个,防止出现混淆:

$what = "brontosaurus steak";
$n = 3;
print "fred ate $n $whats.\n";          # not the steaks, but the value of $whats
print "fred ate $n ${what}s.\n";        # now uses $what
print "fred ate $n $what" . "s.\n";     # another way to do it
print 'fred ate ' . $n . ' ' . $what . "s.\n"; # an especially difficult way

14. Comparision Operators. Perl中用作Number和String的比较操作符是不一样的,具体看附件1,很详细,要对两个字符串做比较,要用eq, ne这样的operator,不能用>, <这些符号。Perl在做字符串比较的时候,是一个char一个char比较的,注意:大写字母比小写字母要小,因为在ASCII码表中,所有的大写字母是排在小写字母前面的。
15. If control structure. 和C一样的,不同的是,{}什么时候都不能省,C中如果if的从句只有一句的话,可以省略{},Perl不行。

Code: Select allif ($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";
}
16. Boolean Value. Perl没有专门的bool类型的数据。Perl判断bool依靠的是以下三条:
If the value is a number, 0 means false; all other numbers mean true.
If the value is a string, the empty string ('') means false; all other strings mean true.
If the value is another kind of scalar than a number or a string, convert it to a number or a string and try again.[]
要注意的是,字符串"0"也表示false,empty string也表示false,这是一个特例。掌握了上面三条,我们就可以在Perl的if中灵活书写bool条件了。
17. Getting user input. Perl中获得用户输入非常简单,直接用关键字<STDIN>,如下:
Code: Select all$line = <STDIN>;
if ($line eq "\n") {
  print "That was just a blank line!\n";
} else {
  print "That line of input was: $line";
}

如果要从一个文件中获取输入,请参考Chapter 5。另外注意,用这种方式读进来的字符串,末尾会有一个newline(\n),和C一样的,要去掉行尾的\n,请用chomp

18. chomp. chomp是一个function,用来去掉行尾的\n,如下:

chomp($text = <STDIN>); # Read the text, without the newline character
      
$text = <STDIN>;        # Do the same thing...
chomp($text);           # ...but in two steps

一般推荐用第一种写法,简洁。也可以这样写:chomp  $text,Perl中很多时候调用一个function,可以不加括号,除非某些特殊情况。而且chomp作为一个function,是有return  value的,不过chomp的return  value一般用不上,他表示chomp去掉了多少个\n,一般这个值就是1。chomp也只会去掉一个\n,如果一行中有多个\n,chomp也只会去 掉一个,如果行中没有\n,那chomp等于什么都没做。
  
19. The while control structure. 看一段代码就OK:

Code: Select all$count = 0;
while ($count < 10) {
  $count += 2;
  print "count is now $count\n"; # Gives values 2 4 6 8 10
}
和if一样,{}在什么情况下都不能省略。
20.  undef value.  前面已经提到过了,如果一个变量没有赋过值的话,他的值就是undef,如果这是一个Number,那么,这个undef将被解释成0,如果是一个 String,那么这个undef就会被解释成empty  string。有的时候我们可以利用这个特性,直接使用一个变量,大部分情况下,这是没有什么问题的。如果我们打开了Perl的warning功能,那么 当引用一个undef的variable的时候,Perl会打印warning信息。
21. defined function.  我们可以使用Perl提供的defined这个function来测试一个变量的值是不是undef(而不是0或者是empty  string)。有的时候会有undef的情况出现,比如,当读入一个文件的时候,如果读到了EOF,那么,变量就会变成undef的值:
Code: Select all$madonna = <STDIN>;
if ( defined($madonna) ) {
  print "The input was $madonna";
} else {
  print "No input available!\n";
}

我们也可以手动给变量赋undef的值,不过这样做的话,其实就等于什么都没做。

$madonna = undef; # As if it had never been touched

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156607-1-1.html 上篇帖子: 用perl做文本替换 下篇帖子: perl文本输出对齐
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表