Learning Perl 4ed Reading Notes - Chapter2 Scalar Data

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 all
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";
}


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
 

你可能感兴趣的:(reading)