1.3 一个班级的例子"grades" |
假设你对你所教班级的每个成员有一个分数集。你喜欢针对每个学生的全年级的一个综合表,并加上平均分。你有一个文本文件(名为"grades"), 如下:
Noe:1 25
Ben 76
Clementine 49
Norm 66
Chris 92
Doug 42
Carol 25
Ben 12
Clementine 0
Norm 66
amp;...
你使用下面程序收集所有的成绩, 确定每个同学的平均成绩, 并按字母顺序把他们打印出来。这个程序假设在你的班级没有两个Carols。即,如果有Carol的第二个输入, 程序认为这是第一个Carol的另一个成绩。
行号不是程序的一部份,就象BASIC的行号。
1: #!/usr/bin/perl
2:
3: open(GRADES, "grades") or die "Can't open grades $!";
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: $aberage =$total / $scores;
18: print "$student: $grades$student: $aberage";
19:
在你看这个例子以前, 我们最好指出: 这个例子演示了许多我们到目前已讨论的问题, 加上我们现在将解释的。但是如果你注意,你能看到一些有趣的句型。让我们猜测将继续什么,如果你对了,然后我们再告诉你。我们将告诉你怎样运行这个程序。
1.3.1 怎样做
现在你可能想知道怎样运行一个Perl程序。简短的回答是:你把这个给Perl的解释器输入, 这个解释器恰好叫perl。较长的答案是这样:有多种进行运行的方法[1]。
[1]那就是Perl的誓言, 你将厌烦听这个, 除非你是这方面的专家, 这时你将厌倦说这个。有时缩写为TMTOWTDI, 其发音为"tim-today"。但你喜欢怎样发音都可以。总之,TMTOWTDI。
引用perl的第一种方法(并且是在任何操作系统上可能工作的方法)是简单地从命令行显示调用perl。如果你在UNIX上, 并正做相当简单的事情, 你可以使用-e开关(在下例中的%表示一个shell命令, 所以不用打印它) :
%perl -e 'print "Hello, world!";'
在其他操作系统中, 你必须和引号一起使用。但基本的原则是一样的:你把Perl处理的事情放入80列左右[2]。
[2]这种类型的程序经常是一行的。你将发现我们一些人更喜欢建立复杂的一行程序。由于这些原因,Perl偶尔已被作为一种只写语言。
对于较长的程序,你能使用文本编辑器把你的所有命令输入一个文件,然后假设你命名这个程序为“gradation”(不要和graduation混淆), 你最好说:
% perl gradation
你仍正在显示地引用Perl, 但至少你不必每次都把所有命令写在命令行。并且也不必使用引号以使shell高兴。
调用一个程序最方便的方法就是直接命名它(或click on it), 并让操作系统为你找到解释器。在某些系统,用一种特别应用联结各个文件或目录。在另一些系统中,为了联结Perl程序和Perl解释器, 你能做任何。在支持#!表示的UNIX系统中(现在多数UNIX系统都能做到), 你能使程序的第一行具有摩力, 所以操作系统将知道运行哪一个程序。把我们例子中的第一行写入你的程序中:
[3]如果Perl不是在/usr/bin目录, 你将必须相应地改变#!。
#!/usr/bin/perl
然后你所做的一切是
%gradation
当然, 这并不能工作, 因为你忘记使这个程序是可执行的(看man页中的chmod(1))[4], 并在你的PATH中。如果程序不在你的PATH中, 你必须提供一个完整的文件名,以便操作系统知道怎样发现你的程序。象这样
[4]虽然Perl共享这种表示, 但必须在UNIX上激活。chmod(1)的意思是chmod命令在UNIX手册的第一部分。如果你打印man 1 或man -s 1 chmod (按着你的习惯),你将能够找到关于命令chmod的所有信息。(当然, 如果你的系统不是UNIX, 那么你必须参考你的系统文件, 找到等价的命令。)
% ../bin/gradation 最后, 如果不幸你是在一种古老的UNIX系统上, 不支持#!行, 或者如果你解释器的路径长大于32个字符(在许多系统上的限制), 你可以这样:
#!/bin/sh -- # perl, to stop looping
eval 'exec /usr/bin/perl -S $0 $1+"$@"'
if 0;
为处理/bin/csh, DCL, COMMAND.COM, 或任何缺省命令解释器, 许多操作系统对这个要求变量。问你的专家。
整个这本书中, 我们将只使用#!/usr/bin/perl表示所有这些, 你应明白我们的意思。
当你写一个检验程序时,不要称它为test。UNIX系统有一个test命令, 这个程序将代替你的程序而被执行。一定要起个别的名字。
当学习Perl时, 甚至你认为你知道你正在做什么以后, 我们建议使用-w选项, 特别在开发期间。这个选项将所有类型的有用和有趣的警告消息开关打开,不必按那个顺序。你能把-w开关放在第一行, 象这样:
#!/usr/bin/perl -w
既然你直知道怎样运行你自己的程序(不要和perl程序混淆), 让我们回到前面的例子。
Copyright: NPACT |