Perl语言学习笔记-初级

 Perl 是一种容易学习和使用的语言。

1.第一个程序示例:

print "Hollo, World!/n"; # perl的输出类C 同类还有printf--格式输出,sprintf--格式预输出

phrase = "Howdy, world!/n"; 
print $phrase;

    请注意,在 Perl 中我们不必事先定义 $phrase 是什么类型的变量,$ 符号告诉 Perl, phrase
是一个标量,也就是包含单个数值的变量。与此对应的数组变量使用 @ 开头。(可以将 $ 理解成代
表 "s" 或 "scalar"(标量),而 @ 表示 "a" 或 "array" (数组)来帮助你记忆。)

2.perl的数据种类:

    Perl 还有象“散列”(又名“哈希结构”或“hash”,或称“关联数组”),“句柄”(或称
“资源符”),“类型团”(或称“指针”)等其他一些变量类型,与标量和数组一样,这些变量类
型也是前导趣味字符,下面是你将会碰到的所有趣味字符:

类型 字符 例子 用于哪种名字
标量 $ $cents 一个独立的数值(数字或字串)
数组 @ @large 一列数值,用编号做键字
散列 % %interest 一组数值,用字串做键字
子过程 & &how 一段可以调用的 Perl 代码
类型团 * *struck 所有叫 struck 的东西


3.关于数组的解释:
    将食物中的水果列出,列表如下:
    $food{"fruit"} = ("apple", "peach", 'banana", "pear");   # 错
    很不幸,代码并不能象你希望的那样运转,因为在 Perl 中括弧和逗号还不够强大,还不能将一
个列表转换成为标量(在语法中,圆括弧用于分组,逗号用于分隔)。你需要明确地告诉 Perl 你想
将一个列表当成一个标量。[] 中括弧能够实现这个转换: 
    $food{"fruit"} = ["apple", "peach", 'banana", "pear"];   # 正确

4.简单数据结构:
    Perl 也有一些主题化的方法,最主要的就是使用 package 声明。例如你想在 Perl中讨论 Camels,
你会在 Camel 模块中以下面的方法开头: 
    package Camel;
    计算机科学家称之为一个 package 建立了一个名字空间,或称“命名空间”,基于OOP(面向对象
编程)的设计方法。
    use Camel;  # 使用Camel包
    $fido = new Camel "Amelia"; # 实例化Camel包
   
5.一个平均值例子:

    假如你在一个班中教授 Perl 语言,并且你正在想如何给你的学生评分的方法。你有全班所有人每次
考试的成绩,它们是随机的顺序,你可能需要一个所有同学的等级列表,加上他们的平均分。你有一份象
下面一样的文本文件(假设名字为 grades):

Noël 25
Ben 76
Clementine 49
Norm 66
Chris 92
Doug 42
Carol 25
Ben 12
Clementine 0
Norm 66
...

你可以用下面所示的脚本将所有的成绩收集在一起,同时计算出每个学生的平均分数,并将它们按照字母
顺序打印出来。这个程序天真地假设在你的班级中没有重名的学生,比如没有两个名为 Carol 的学生。
如果班级中有两个 Carol,文件中所有以 Carol 开头的条目,程序都会认为这是第一个 Carol 的成绩(
但是不会跟 Noel 的成绩混淆)。

顺便说一句,下面程序里的行号并不是程序的一部分,任何与 BASIC 类似的东西都是站不住脚的。

 1  #!/usr/bin/perl
2
3 open(GRADES, "grades") or die "Can't open grades: $!/n";
4 while ($line = <GRADES>) {
5 ($student, $grade) = split(" ", $line);
6 $grades{$student} .= $grade . " ";
7 }
8
9 foreach $student (sort keys %grades) {
10 $scores = 0;
11 $total = 0;
12 @grades = split(" ", $grades{$student});
13 foreach $grade (@grades) {
14 $total += $grade;
15 $scores++;
16 }
17 $average = $total / $scores;
18 print "$student: $grades{$student}/tAverage: $average/n";
19 }

 

 

6.文件处理:
   你可以用 open 函数创建用于不同用途(输入,输出,管道)的文件句柄,因此你必须指定你需要哪
种类型。 象在命令行中一样,你只需简单地在文件名中加入特定的字符。
   open(SESAME, "filename")         # 从现存文件中读取
   open(SESAME, "<filename")         # (一样的东西,明确地做)
   open(SESAME, ">filename")         # 创建文件并写入
   open(SESAME, ">>filename")         # 附加在现存文件后面
   open(SESAME, "| output-pipe-command")   # 设置一个输出过滤器
   open(SESAME, "input-pipe-command |")      # 设置一个输入过滤器

7.操作符
 
7.1 双目算术操作符

    算术操作符和我们在学校中学到的没有什么区别。它们对数字执行一些数学运算。比如:

例子 名字 结果
$a + $b 加法 将 $a 和 $b 相加
$a * $b 乘法 $a 和 $b 的积
$a % $b $a 被 $b 除的余数
$a ** $b 取 $a 的 $b 次幂

7.2字符串操作符

    Perl 中有一个“加号”来串联(将字符串连接起来)字符串。与其它语言不一样,Perl 定义了一个
分隔操作符 (.) 来完成字符串的串联,这样就不会跟数字的加号相混淆。

   $a = 123;
$b = 456;
print $a + $b; # 打印 579
print $a . $b; # 打印 123456

同样,字符串中也有“乘号”,叫做“重复”操作符。类似的,采用分隔操作符(x)同数字乘法相区别:

   $a = 123;
$b = 3;
print $a * $b; # 打印 369
print $a x $b; # 打印 123123123

7.3 赋值操作符

    我们已经多次使用了简单的赋值操作符 =,虽然准确地说它不是一个数学操作符。你可以将 = 理解
为“设为”而不是“等于”(数学等于操作符 == 才表示等于,如果你现在就开始理解它们的不同之处,
你将会省掉日后的许多烦恼。== 操作符相当于一个返回布尔值的函数,而 = 则相当与一个用于修改变
量值的过程)。

根据我们在前面已经提到过操作符的分类,赋值操作符属于双目中缀操作符,这就是意味它们在操作符的
两边都有一个操作数。操作符的右边可以是任何表达式,而左边的操作数则必须是一个有效的存储空间(
也就是一个有效的存储空间,比如一个变量或者是数组中的一个位置)。最普通的赋值操作符就是简单赋
值,它计算右边表达式的值,然后将左边的变量设置成这个值:

   $a = $b;
$a = $b + 5;
$a = $a * 3;

7.4 单目算术操作符

如果你觉得 $variable += 1 还是不够精简,同 c 一样,Perl 有一个更短的方法自增变量。使用
自增(自减)操作符可以将变量的值简单地加上(减去)一。你可以将操作符放在变量的任何一边,这取决于
你希望操作符什么时候被执行:

例子 名字 结果
++$a, $a++ 自增 向 $a 加一
--$a, $a-- 自减 从 $a 中减一

如果你将自增(减)操作符放在变量的前边,变量就成为“预增”变量。变量的值在它被引用前改变。如果
放在变量的后边,被称为“后增变量”,它在被引用后改变。如:

   $a = 5;         # 给 $a 赋予 5
$b = ++$a; # $b 被赋予 $a 自增之后的值,6
$c = $a--; # $c 被赋予 6,然后 $a 自减为 5

7.5 逻辑操作符

    逻辑操作符,也称为“短路”操作符,允许程序不使用嵌套 if 语句,而根据多个条件来决定执行流程。
他们之所以被称为“短路”操作符,是因为当认为左边的参数能够提供足够的信息来决定整个值的时候,它
们跳过(短路)执行右边的参数。这不仅仅是为了效率。你可以依靠这种“短路”的特性来避免执行为左边
代码做防护的右边的代码。比如你可以说“California or bust!”,在 Perl 中将不会有 bust(假设你已
经到达 California)。

实际上 Perl 有两组逻辑操作符,一组传统操作符是借鉴了 C 中的操作符,另外一组比较新(或者更旧的)
低级操作符借鉴了 BASIC 中的操作符。两组操作符在使用适当的情况下都很易读。如果你希望逻辑操作符比
逗号优先级更高,那么 c 的符号操作符运转得很好,而如果你希望逻辑操作符比逗号优先级更低时,BASIC
的基于词的操作符比较适合。在很多情况下,它们得到相同的结果。使用哪一组你可以根据你自己的喜好来选
择。(你可以在第三章中的“逻辑与,或,非和异或”小节找到对比例子)。虽然由于优先级不同,这两组操
作符不能互换,但是一旦它们已经被解析,操作符的效果是一样的,优先级只能在它们参数的范围内起作用。
表 1-1 列出了逻辑操作符。

表 1-1 逻辑操作符

例子 名字 结果
$a && $b 如果 $a 为假则为 $a,否则为 $b
$a || $b如果 $a 为真则为 $a,否则为 $b
! $a如果 $a 为假则为真
$a and $b 如果 $a 为假则为 $a,否则为 $b
$a or $b 如果 $a 为真则为 $a,否则为 $b
not $a 如果 $a 为假则为真
$a xor $b 异或 如果 $a 或 $b 为真,但不能同时为真

 

下面的代码(平均分数例子中的第 4 行)试图打开文件 grades:

open(GRADES, "grades") or die "Can't open file grades: $!/en";

如果成功打开了文件,将跳到下一行继续执行,如果不能打开文件,程序将打印一个错误信息并停止执行.

$! 变量包含了操作系统返回的错误信息

7.6  比较操作符

比较操作符告诉我们两个标量值(数字或字符串)之间的比较关系.假设两个参数是 $a 和 $b,我们可以:

比较 数字 字串 返回值
等于 == eq 如果 $a 等于 $b 返回真
不等于 = ne 如果 $a 不等于 $b 返回真
小于 < lt 如果 $a 小于 $b 返回真
大于 > gt 如果 $a 大于 $b 返回真
小于或等于 <= </td> le 如果 $a 不大于 $b 返回真
比较 <=> cmp 相等时为 0,如果 $a 大为 1 如果 $b 大为 -1

最后一对操作符(<=> 和 cmp)完全是多余的,但是在 sort 函数中,它们非常有用(参看 29 章).

7.7 文件测试操作符

    下面是一些文件测试操作符:

例子 名字 结果
-e $a 存在 如果在 $a 中命名的文件存在则为真
-r $a 可读 如果在 $a 中命名的文件可读则为真
-w $a 可写 如果在 $a 中命名的文件可写则为真
-d $a 目录 如果在 $a 中命名的文件是目录则为真
-f $a 文件 如果在 $a 中命名的文件是普通文件则为真
-T $a 文本文件 如果在 $a 中命名的文件是文本文件则为真

你可以象下面例子中一样使用它们:

-e "/usr/bin/perl" or warn "Perl is improperly installed/n"; -f "/vmlinuz" and print "I see
 you are a friend of Linus/n";

注意普通文件并不等同于文本文件,二进制文件 /vmlinuz 是普通文件,而不是文本文件.文本文件与二
进制文件对应.而普通文件则是和目录及设备等非普通文件相对应.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值