《Perl语言入门》自学笔记--第二章

原创 2004年07月17日 23:17:00

第二章 标量数据

Perl中的标量表示的范围很大,包括数字和字符/字符串。而且数字也不像c中有浮点数,单精,双精,整数...之分,只要是数字就是标量。而且所有的数字其内部格式都一样,perl将整数保存为浮点数,计算也是按照浮点数进行计算。

数字的表示方法:(在这方面还是可以看出perl的随意性)
1.25
255.000
7.25e45
-6.5e24
-12e-24
-1.2E-23
0
-40
61298040283768
61_298_040_283_768
(这个数字和上面的表示方法是相同的,只是现实生活中是用逗号,而这里是用_。因为逗号已经有了更重要的作用)
0377 (八进制的377)
0xff (十六进制的FF)

数值操作符
2+3 (2加3=5,也可以在加号左右加上空格。perl这方面要求很宽松,下面等同)
5.1-2.4 (5.1减2.4=2.7)
3*12
14/2
10.2/0.3
10/3
10%3
(取余,需要指出的是,如果2个数值是小数,则perl的处理方式先将小数化为整数,如10.5%3.2是按照10%3来计算的)
2××3 (2的3次幂)

单引号字符串: 单引号本身不是字符串的一部分,用来让perl确定字符串的开始和结束。里面就是字符的实际意思,不像双引号字符串有很多转义。不过如果在单引号中要表示单引号和反斜杠怎么要在前面多加一个反斜杠。
'fred'
''
'hello/n'
(这里/n不是回车换行符,只是2个字符)
'/'//' (一个单引号,一个反斜杠)

双引号字符串:将可以解释很多转义字符(见下表),并且双引号里可以内插变量。
"barney" (和'barney'一样的意思)
"Hello world/n"

写法 含义
/n 换行
/r 回车
/t 制表符
/f 换页
/b 退格符
/a 响铃
/e Esc
/007 任意的ASCII码的八进制值(这里007=响铃)
/x7f 任意ASCII码的十六进制值(这里7f=删除)
/cC 任意Ctrl键组合字符(这里是Ctrl-C)
// 反斜杠
/" 双引号
/l 下一个字母小写
/L 所有后面的字母小写直到/E
/u 下一个字母大写
/U 所有后面的字母大写直到/E
/Q 添加反斜杠引用后面的非单词字符,直到/E
/E 结束/L、/U或/Q

字符串操作符:"." 和 "x"

.操作符就是用来字符串连接的

"hello" . "world" (结合起来就是"helloworld")

"hello" . ' ' . "world" (结合起来就是"hello world")

x操作符叫做串重复操作符,后面跟数字代表重复次数

"fred" x 3 (fredfredfred)

5 x 4 (5555,注意,这里也只能是整数进行串重复操作,如果小于1则等于空)

数字和字符串的自动转换:

在大多数情况下,Perl会根据操作符来自动判断对象是字符串还是数字。这方面perl的处理很智能化,你可以开启perl的警告开关,这样你如果用的不合适,perl会提示你。也就是我在第一章里的说的-w开关,用在perl程序的第一行。

 

标量变量:

Perl的变量是以美元符号$开头的,以字母或者下划线开头,并且分大小写!

二元赋值操作符:

$fred += 5; (等于$fred = $fred + 5)

$fred *= 3; (等于$fred = $fred * 3)

$str .= " " (等于$str = $str . " ")

优先级:

Perl的优先级和C一模一样^_^

比较操作符:

还是列一张表吧,看起来比较清楚:

比较 数值 字符串
相等 == eq
不相等 != ne
小于 < lt
大于 > gt
小于等于 <= le
大于等于 >= ge

两点提示:

  1. 和shell的处理方式正好相反,一般人还是比较习惯这里的处理方式。
  2. 如何记忆字符串的关键字:其实都是英文单词的所写,只要弄明白什么意思就ok了。具体如下(不一定准确^_^,方便记忆就好):eq=equal、ne=not equal、lt=less than、gt=great than、le=less than、ge=great than

if控制结构:

通过举例来说明if语句的结构:

if ($name gt 'fred') {

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

}

这是最简单的if语句,没有else段。下面再在上面的基础上加上else:

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

}

看到这里我有个疑问。这两个例子都是书上照搬下来的,按照我前面看的结果应该在print语句中$name不应该加上单引号,这样才能真正显示变量的内容。如果加了单引号不是就代表$name了?马上试验做分晓:在这段例子前面我加了$name="marco";

但是结果的显示:

bash-2.05$ ./test.plx
'marco' comes after 'fred' in sorted order.

说明单引号还是可以解释变量内容的。不过我再继续验证单引号是否真的可以解释变量,因此很简单的写了几句话:

#!/usr/local/bin/perl -w
$named="marco";
print '$named';

结果确实报错信息:

bash-2.05$ ./test.plx
Name "main::named" used only once: possible typo at ./test.plx line 2.

如果再在单引号的两边加上双引号就ok了。输出结果如下:

'marco'

原来如果单引号放在双引号里面时,单引号就是单引号,没有任何其他意义。ok,明白了^_^

如何判断布尔值的真假?

如果标量值为undef、0、''、或者'0',那它就是假的。其他都为真。

取得用户输入:

应该有很多方法,不过现在先介绍这个操作符。一样,举例来说明:

$line=;

if ($line eq "/n") {

print "That was just a blank line!/n";

} else {

print "That line of input was: $line";

}

值得注意的是由于是以回车做为结束的。但是它也会将回车换行符放入变量中。因此就需要chomp这个非常有用的操作符了^_^。

chomp操作符:

真的是非常有用的一个参数。几乎每个程序都会用到。它实际上是一个函数。它的作用是去掉结尾的一个换行符,如果有2个或者2个以上那就要用同样数字的chomp。

最常用或者说最酷的使用方式是:

chomp($test=);

中规中矩的使用方式是:

$test=;

chomp($test);

推荐使用第一种,这样看起来才象一个Perl程序员^_^。

while控制结构:

例子:

$count=0;

while ($count<10) {

$count += 1;

print "count is now $count/n";

}

不用多解释了,相信是地球人都看的懂的程序^_^。

undef值:

变量在第一次赋值之前它的值就是undef。如果把undef做为数字使用,其功能相当于0,因此它可以很方便的生成一个以空开始的数值累加器:

#累加一些奇数:

$n=1;

while ($n < 10) {

$sum += $n;

$n += 2;

}

print "The total was $sum./n";

这个程序中$sum一开始没有指定值,因此它开始是undef,因为是数字的加法,因此它就被用作0了。

而当这个变量被用作字符时,它的作用和空字符相似。

defined函数:

是专门用来检测变量是否为undef的一个函数,例子:

$madonna = ;

if ( defined($madonna) ) {

print "The input was $madonna";

} else {

print "No input available!/n";

}

习题:题目都可以在5分钟之内完成,不难。不过还是值得做一做的,特别是新手。我算新手,因此都认真做了每一道题目^_^

1. 写一程序,计算半径为12.5的圆的周长。周长是半径的2pi倍(近似于2乘以3.141592654)。你得到的答案应该是大约78.5。

2. 修改上一道题的程序,提示用户输入,并接受用户所输入的一个半径值。这样用户如果输入12.5,她就应该得到与上一道题一样的答案。

3. 修改上一道题的程序,当用户输入一个小于0的数字时,得到的周长应该是0,而不是负数。

4. 写一个程序,提示用户输入并读入两个数字(各占一行),然后打印出两个数相乘的结果。

5. 写一个程序,提示用户输入并读入一个字符串和一个数字(各占一行),然后在不同的行上重复打印该字符串,重复次数由该数字指定。

Unity Shader入门精要学习笔记 - 第7章 基础纹理

纹理最初的目的就是使用一张图片来控制模型的外观。使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色。 在美术人员建模的时候,通常会在建模软件中利用纹理展开技术把纹理映射坐标存储...
  • u010848412
  • u010848412
  • 2017年06月03日 23:11
  • 1400

python自然语言处理学习笔记第二章

1  NLTK 包含古腾堡项目(Project Gutenberg)电子文本档案的经过挑选的一小部分文本。该项目大约有25,000(现在是36,000 了)本免费电子图书,放在http://www.g...
  • huang2009303513
  • huang2009303513
  • 2013年11月08日 14:21
  • 1941

Perl笔记:Perl语言入门(第六版) - IO文件目录

输入与输出 读取标准输入 chomp($line = ); chomp截掉最后的换行符,标准输入。 while (defined($line = )) { print "$line"; } 简写whi...
  • u012740949
  • u012740949
  • 2014年01月27日 14:53
  • 1418

Perl语言入门笔记 第二章 标量数据

#!/usr/bin/perl -w =pod 数字: perl中的数字全部是以双精度浮点数存储的 数字很长时特俗写法,当然普通写法更支持: 61_298_040_283_768 0377 #...
  • q1241580040
  • q1241580040
  • 2015年08月23日 15:41
  • 303

Perl语言入门笔记 第八章 用正则表达式进行匹配

#用正则表达式进行匹配 =pod m// = // = m%%,m||,m,m{},m(),匹配的时候根据需要写自己的定界符,像qw省略双引号定界符一样 模式匹配修饰符: 跟在定界符后面的,//...
  • q1241580040
  • q1241580040
  • 2015年09月21日 01:44
  • 2086

Perl语言入门笔记 第九章 用正则表达式处理文本

=pod #第九章:用正则表达式处理文本 用s///进行替换 s///查找替换功能 s/Barney/Fred/; #把Barney替换成Fred s/with (\w+)/against $1...
  • q1241580040
  • q1241580040
  • 2015年09月21日 01:47
  • 654

<Perl语言入门>读书笔记 | 三. 列表和数据

读书笔记的第三章,列表和数据,也就是所谓的数组。这里最重要的一个概念是,Perl中的表达式的上下文概念。...
  • Titan0427
  • Titan0427
  • 2016年02月25日 18:50
  • 586

Perl语言入门笔记 第十六章 进程管理

=pod 第十六章 进程管理 身为程序员最棒的一面,就是能运行别人的程序,不必自己动手去写。 在perl里有一句话叫 “办法不止一种” system函数: 在perl中,启动子进程最简单的...
  • q1241580040
  • q1241580040
  • 2015年09月21日 02:08
  • 362

Perl语言入门笔记 第六章 哈希(hash)

=pod 哈希 哈希表里只是一堆的键值对而已,而没有任何顺序,键可以是任意字符串,值也是 awk的哈希键值对增多的时候会逐渐变慢,而perl没有这个缺点 访问哈希元素: ...
  • q1241580040
  • q1241580040
  • 2015年09月21日 01:33
  • 813

Perl语言入门笔记 第十二章 文件测试

=pod 第十二章 文件测试 文件测试操作符: -e:判断文件是否存在 在创建新文件程序之前,应先检查指定的文件是否已经存在,以免意外覆盖重要的电子表格或是宝贵的生日档案。要...
  • q1241580040
  • q1241580040
  • 2015年09月21日 01:58
  • 583
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Perl语言入门》自学笔记--第二章
举报原因:
原因补充:

(最多只允许输入30个字)