Perl语言学习笔记(二) 标量数据

 

第二章 标量数据

 

标量(Scalar):单件事物,数字或字符组成的串

 

所有数字的内部格式都相同:总是按照“双精度浮点数”的要求来保存并进行运算。即,Perl中不存在整数值。

 

浮点数直接量 :没什么好说的

 

整数直接量:可以用下划线将若干位数分开,如61298040283768可以写成61_298_040_283_768

 

非十进制度整数直接量:0377八进制,0xFF十六进制,0b11111111二进制。0x1377_0B77。前置零的表示法只对直接量有效,但不能在字符串自动转换成数字时使用

 

数字操作符:取模操作符%先取整后再求余,10.5  % 3.2 和 10 % 3的计算结果相同。取模对负数的处理不同版本不一样。乘幂操作符以双星号表示,2 ** 3 = 8。

 

字符串:字符串能够包含任何字符,所以可用它来对二进制数据进行创建、扫描于操作,读入一个图形文件或可执行文件到Perl的字符串变量里,改变它的内容,再写回去。有两种字符串直接量。

 

单引号内的字符串直接量:单引号内所有字符都代表它们自己(包括换行符)。要表示反斜线和单引号本身,需要在前面加一个反斜线。

'hello\n' # hello 后面接着反斜线和n

'hello

there' # hello、换行符、there(总共11个字符)

'\'\\' # 单引号,紧接着反斜线

要注意的是,单引号内的\n并不代表换行字符,而是表示反斜线和n这两个字符。只有在后面是另一个反斜线或单引号时,前面的反斜线才有特殊的意义

 

双引号内的字符串直接量:跟其他语言里的字符串没什么两样,不过变量内插是个什么东西?

 

字符串操作符: 

“.”操作符连接字符串(必须显式使用): 'hello wrold' . "\n" # 等同于"hello world\n"

字符串重复操作符(小写字母x): "fred" x 3 # "fredfredfred"

   5 x 4 # "5555" 5先被转换成单字符的串"5" 

    右操作数在使用前会先取整,复制次数小于1时,会生成长度为零度空字符串

 

数字与字符串之间的自动转换:

自动转换取决于操作符需要什么类型的操作数。字符串转换成数字时会转换成等效的十进制浮点数。前置零的技巧只对直接量有效,不能用在字符串的自动转换上。用hex()或oct()来转换字符串。"12" * "3" 结果是36,字符串中非数字的部分以及前置度空白符号会被略过。"12fred34" * "3"结果也是36。完全不含数字的字符串被转换成零。"Z" . 5 * 7 # 等同于"Z35"。

 

Perl内建警告信息:

运行程序时使用-w选项启用警告功能:$ perl -w my_program

使用#!指名每次运行都启用警告功能:#!/usr/bin/perl -w

在Perl 5.6及更高版本,启用warnings编译命令打开警告功能:

    #!/usr/bin/perl

     use warnings;

启用diagnostics编译命令查看更详细的问题描述:

    #!/usr/bin/perl

     use diagnostics;

启用diagnostics编译命令后,程序启动时会加载警告和详细说明到内存中,影响程序速度。所以可通过命令行选项-M仅在需要时再加载diagnostics编译命令:$ perl -Mdiagnostics ./my_program

 

标量变量: 以美元符号($)开头,后跟Perl标识符,区分大小写。

 

慎选变量名称: :-)

 

标量的赋值: 就用等号吧

 

双目赋值操作符: o(∩∩)o...哈哈

 

用print输出结果: 可以用print输出一系列用逗号隔开的值。

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

这实际上是一个列表(list),列表是什么?

 

字符串中的标量变量内插:

双引号圈内的字符串直接量能进行变量内插。就是说,字符串内的所有标量变量名,都会被替换为该变量的当前值。

$meal = "brontosaurus steak";

$barney = "fred ate a $meal"; # $barney现在是"fred ate a brontosaurus steak"

$barney = "fred ate a " . $meal; # 另一种等效的写法,表明不用双引号也可以达成相同效果

没有被赋值过的标量变量会用空字符串来代替。

如果要打印的就是这个变量,则不必使用变量内插方式

  print "$fred"; # 双引号是多余的

  print $fred; # 这样写比较好

变量内插也称双引号内插,因为它只会在双引号(而非单引号)里起作用。

如果要将美元符号本身放进双引号内的字符串,可以在它前面用反斜线转义。

$fred = 'hello';

print "The name is \$fred.\n"; # 会输出$符号

print 'The name is $fred' . "\n"; # 单引号,这样也行

进行内插时,Perl会尽可能使用最长且合法的变量名称。要是你想在内插值的后面,紧接着输出字母、数字或下划线,可能会碰上麻烦:当Perl检查变量名称时,它会违背你的本意,将后面的字符当作变量名称的一部分。解决办法很简单,和shell脚本一样,Perl里面我们可以用一对花括号将变量名围起来,以避免歧义。要不然,可以先把字符串拆成两半,再利用连接操作符接起来:

$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";     # 写起来特别麻烦

另外还有一些可能会出问题的字符。在标量变量名称的后面,如果需要接上左方括号(是不是还有另一个符号?书上貌似有印刷错误),请在括号前面加上反斜线。要是变量名称后面的接的是单引号或两个冒号,也需要用同样的方式处理。也可以用上述方法中提到的花括号表示法来代替。

 

操作符的优先级与结合性:

4 ** 3 ** 2 # 4 ** (3 ** 2),得4 ** 9 (向右结合)

72 / 12 /3 # (72 / 12) / 3,得6/3,得2 (向左结合)

因为**是向右结合的,所以隐含的括号便放在右边。而/是向左结合的,因此隐含的括号便放在左边。

 

比较操作符:

    ==, !=, <,  >, <=, >=

eq ne lt gt le ge

35 != 30 + 5 # 假

'35' eq '35.0'    # 假 (当成字符串来比较)

' ' gt ' ' # 真

'fred' lt 'free' # 真

 

if控制结构:

if ($name gt 'fred') {

print "'$name' comes after 'fred' in sorted order.\n";

} else {

print "'$name' does not come after 'fred'.\n";

}

可选的程序块周围一定要加上表示块界限的花括号。

 

布尔值:

任何标量值都可以成为if控制结构里的判断条件。

Perl没有专用的布尔值。

数字0为假,其他数字为真。

空字符串('')为假,其他字符串为真。

如果不是数字也不是字符串,先转换成数字或字符串再进行判断。

字符串'0'跟数字是同一个标量,字符串'0'是唯一被当成假的非空字符串。

 

获取用户输入:

只要在程序代码中能使用标量值的位置写上行数入操作符<STDIN>,Perl就会从标准输入读进一行文字,直到换行符为止。<STDIN>返回的字符串,一般在最后都会跟有一个换行符。

 

chomp操作符:

作用于一个内容为字符串的变量上,移除此字符串结尾的一个换行符(如果有,不论有几个)。

在Perl程序里,任何需要变量的地方都可以用赋值运算来替代。首先,Perl执行赋值操作,然后按你想要的任意一种方式使用变量。chomp常见用法:chomp($text = <STDIN>);  #读入文字,略过最后的换行符。

chomp返回值是实际移除的字符数。

使用chomp时可以不加括号,这是Perl的一项惯例:除非去掉括号会改变表达式的意义,否则括号用不用都可以。

 

while控制结构:

$count = 0;

while ($count < 10) {

$count += 2;

}

花括号必不可少!

 

undef值:

标量变量在首次被赋值之前,其初始值就是undef。undef作为数字,它会假设这是0,如果是字符串,它会假设这是空字符串。但是undef不是数字也不是字符串,它是另一种类型的标量值。

 

defined函数:

使用defined判读某个字符串是undef而不是空字符串。如果是undef,该函数返回假,否则返回真。defined($madonna)

如果想自己创建undef值,可以直接使用同名的undef操作符:

$madonna = undef;

 

 

There is more than one way to do it!

 

 

 

 

 

 

 

 

 

posted on 2011-01-22 13:15  WangLong  阅读(889)  评论(0)    收藏  举报

导航