Perl 简介
##########################################################################
# 版权声明 #
# #
# 本篇文章的版权为作者萧永庆先生所有. 允许网路上的非营利转载. #
# 作者的电子邮件地址:syc@cc.ntu.edu.tw #
# #
# 本文可在下列URL取得: #
# ftp://ftp.math.ncu.edu.tw/chinese/DOC/ #
##########################################################################
Perl 简介 - $ID$
写在前面: 有点懒懒的, 不太想用脑筋构思文章,想看的人就忍耐一下吧。
Perl是什麽东西呢? Manual上是这样写的: Practical Extraction and Report Language
它原始的目的就是用来取代UNIX原有的sed/awk 与shell script的组合, 用来
汇集资讯, 产生报表的一个工具语言(程式)。不过随着版本的改进,功能越来
越强,现在的功能已经超乎原先设计时的想像,几乎任何事都可以做到,也变
成每一部UNIX工作站必备的标准工具了。
Perl的作者是Larry Wall, 曾经贡献过好几个很有用的
程式给大家(public domain)使用,包括patch和rn。他设计perl时的哲学是以
实用为第一优先,(所谓的实用就是语言容易使用, 有效率, 而且完整),而不是设
计一个看起来很漂亮的语言。(漂亮就是程式非常的小,语法幽雅,而且只由
最少的语法基本元素构成)。Perl包含了C, sed, awk,和sh这几个工具最好(作
者(Larry) 说的) 的特色,而且主要的语法很接近C 语言, 对原本熟悉C 语言
的人来说非常容易上手。
--------------------------------------------------------------------------
讲完废话,可以进入主题了。首先,我们按惯例用perl写个程式印出Hello,World
吧。首先,用你自己最喜欢的编辑器建立hello这个档案,如下:
#!/usr/local/bin/perl
#
# Program 'hello': print out 'Hello, World' on standard out.
#
print "Hello, World" ;
# end of file
前面几个以 #号开头的行在UNIX的习惯里面是释,所以实际上的程式
只有一行而已。不要忘掉print 那一行最後的那个分号。还有要注意perl
会区分大小写。
不过这里有个小细节要注意,就是第一行:
#!/usr/local/bin/perl
乍看之下是释,其实它大有作用。在古早的UNIX系统里面,可执行档分作两种,
一种是包含机器指令的二进位档,系统可以直接载入执行;另外一种叫做
script档,也就是包含一些shell命令的普通文字档:UNIX一遇到这种文字档
就会自动载入/bin/sh去解译与执行它。不过随着UNIX的发展,shell越来越多,
实在不晓得script档是用哪种shell写的。所以就发展出一个机制,在每个script
档的第一行(前面不可以有空白与空白行)写个#! ,然後接着写真正要负责处理这个
script的程式档路径,就可以让UNIX知道要用那个程式来处理了。另外,顺便唆一下,
这个路径後面还可以再加一个参数(one and only one),如下:
#!/usr/local/bin/perl -f 对
#!/usr/local/bin/perl -pi.bak 对
#!perl -f -pi.bak 不对 -> -pi.bak会被忽略。
反正写超过一个就会被忽略就对了。
好了,回归主题,要如何执行这个程式呢? 有好几个方法:
1. 直接在命令列打: (venus% 是我们shell的提示号,不用输入)
venus% perl hello
2. 让perl从standard input读入perl程式:
venus% perl < hello
3. 把hello改成可执行档,然後再执行:
venus% chmod a+x hello
venus% ./hello
1: 如果你的 $PATH (或 $path in csh)有 "." (目前目录)的话
就可以不用打 "./" 。
2: 你必须确定perl是放在/usr/local/bin/perl上,不然的话
请把这个字串改到正确的值(可能是/bin/perl, 试不出来问root)。
哇!好不容易可以执行第一个程式了。结果应该就是我们期望的Hello, World了。
第二个执行的方法蛮有趣的,换句话说,你可以这样子输入perl程式:
venus% perl (直接按ENTER)
print "Hello,World\n" ;
CTRL-D
CTRL-D就是UNIX的end of file,perl处理命令的时候会整个档案都读入、
分析一遍後,再开始执行,所以Hello,World会在按完CTRL-D後才印出来,
而不是打print ...;之後就立刻印出。
--------------------------------------------------------------------------
唆完一些背景知识後,我们可以把注意力全部集中在perl本身了。首先是
perl支援的变数型态。perl下的变数型态总共有三种: scalars (纯量), arrays
of scalars (纯量阵列), associative arrays (相关阵列?实在不会翻,看下
面的解好了)。
Arrays (of scalars) 与Associative arrays的差别:
"一般所谓的arrays是一块连续的记忆体,它的每一个元素的大小都是一样的,
可以很快的透过数字(第几号元素)利用CPU 本身的定址能力直接取出来;
而associative arrays比较像一张对照表,给定一个值(有可能是一个字串),
要先在这张表内搜寻,找到这个『键』,然後才能找到相对应的值出来。
差别就是arrays (of scalars)速度比较快, associative arrays通常都是
利用一些资料结构达成的,比较慢, 不过比较有弹性就是了。"
perl的变数不需要事先宣告,直接就可以用了。
变数以$ 开头, 以下是几个例子: (每一行都是独立互不相的)
$days # a simple scalar variable
$days[28] # 29th element of array @days
$days{'Feb'} # one value from an associative array
$#days # last index of array @days
一整个(或者是部份的)array用@表示:
@days # ($days[0], $days[1], $days[2], ...$days[n])
@days[3,4,5] # same as @days[3..5] 等於 ($days[3],$days[4],$days[5])
@days{'a','c'} # ($days{'a'}, $days{'c'})
一整个assosiative array用%开头:
%days # (key1, val1, key2, val2, ....)
对於每一种资料型态, 他们的命名空间是互相独立而不受扰的, 也就是说,
$days, @days, %days这三个符号可以同时存在而互不影响。
以上这八种表示法都可以作为lvalue, 换句话说, 都可以放在等号的左边,
可以设值。如下:
$d = 20;
$a[18]=1;
$days{'Feb'} =28;
@arr = ('a','b','c','d','e');
@days[3,4,5] = ( 1, 2, 3 );
@days{'a','c'} = ('Monday','Wednesday');
甚至: ($s1,$s2,$s3) = $Bar(2,3,4);
ps: 前面没有提到, 不过应该很简单, 就是常数array就是用小括号括起来形成一个
"list"就对了。字串就是用单引号或双引号括起来。详情见後面说明。
Array @classes 的大小可以由$#classes的值得到。(实际上是array长度减一,
因为$#classes是@classes最後一个元素的索引(index),而通常array都是从0开始
算的)。 要改变array的大小就直接改$#classe
# 版权声明 #
# #
# 本篇文章的版权为作者萧永庆先生所有. 允许网路上的非营利转载. #
# 作者的电子邮件地址:syc@cc.ntu.edu.tw #
# #
# 本文可在下列URL取得: #
# ftp://ftp.math.ncu.edu.tw/chinese/DOC/ #
##########################################################################
Perl 简介 - $ID$
写在前面: 有点懒懒的, 不太想用脑筋构思文章,想看的人就忍耐一下吧。
Perl是什麽东西呢? Manual上是这样写的: Practical Extraction and Report Language
它原始的目的就是用来取代UNIX原有的sed/awk 与shell script的组合, 用来
汇集资讯, 产生报表的一个工具语言(程式)。不过随着版本的改进,功能越来
越强,现在的功能已经超乎原先设计时的想像,几乎任何事都可以做到,也变
成每一部UNIX工作站必备的标准工具了。
Perl的作者是Larry Wall
程式给大家(public domain)使用,包括patch和rn。他设计perl时的哲学是以
实用为第一优先,(所谓的实用就是语言容易使用, 有效率, 而且完整),而不是设
计一个看起来很漂亮的语言。(漂亮就是程式非常的小,语法幽雅,而且只由
最少的语法基本元素构成)。Perl包含了C, sed, awk,和sh这几个工具最好(作
者(Larry) 说的) 的特色,而且主要的语法很接近C 语言, 对原本熟悉C 语言
的人来说非常容易上手。
--------------------------------------------------------------------------
讲完废话,可以进入主题了。首先,我们按惯例用perl写个程式印出Hello,World
吧。首先,用你自己最喜欢的编辑器建立hello这个档案,如下:
#!/usr/local/bin/perl
#
# Program 'hello': print out 'Hello, World' on standard out.
#
print "Hello, World" ;
# end of file
前面几个以 #号开头的行在UNIX的习惯里面是释,所以实际上的程式
只有一行而已。不要忘掉print 那一行最後的那个分号。还有要注意perl
会区分大小写。
不过这里有个小细节要注意,就是第一行:
#!/usr/local/bin/perl
乍看之下是释,其实它大有作用。在古早的UNIX系统里面,可执行档分作两种,
一种是包含机器指令的二进位档,系统可以直接载入执行;另外一种叫做
script档,也就是包含一些shell命令的普通文字档:UNIX一遇到这种文字档
就会自动载入/bin/sh去解译与执行它。不过随着UNIX的发展,shell越来越多,
实在不晓得script档是用哪种shell写的。所以就发展出一个机制,在每个script
档的第一行(前面不可以有空白与空白行)写个#! ,然後接着写真正要负责处理这个
script的程式档路径,就可以让UNIX知道要用那个程式来处理了。另外,顺便唆一下,
这个路径後面还可以再加一个参数(one and only one),如下:
#!/usr/local/bin/perl -f 对
#!/usr/local/bin/perl -pi.bak 对
#!perl -f -pi.bak 不对 -> -pi.bak会被忽略。
反正写超过一个就会被忽略就对了。
好了,回归主题,要如何执行这个程式呢? 有好几个方法:
1. 直接在命令列打: (venus% 是我们shell的提示号,不用输入)
venus% perl hello
2. 让perl从standard input读入perl程式:
venus% perl < hello
3. 把hello改成可执行档,然後再执行:
venus% chmod a+x hello
venus% ./hello
1: 如果你的 $PATH (或 $path in csh)有 "." (目前目录)的话
就可以不用打 "./" 。
2: 你必须确定perl是放在/usr/local/bin/perl上,不然的话
请把这个字串改到正确的值(可能是/bin/perl, 试不出来问root)。
哇!好不容易可以执行第一个程式了。结果应该就是我们期望的Hello, World了。
第二个执行的方法蛮有趣的,换句话说,你可以这样子输入perl程式:
venus% perl (直接按ENTER)
print "Hello,World\n" ;
CTRL-D
CTRL-D就是UNIX的end of file,perl处理命令的时候会整个档案都读入、
分析一遍後,再开始执行,所以Hello,World会在按完CTRL-D後才印出来,
而不是打print ...;之後就立刻印出。
--------------------------------------------------------------------------
唆完一些背景知识後,我们可以把注意力全部集中在perl本身了。首先是
perl支援的变数型态。perl下的变数型态总共有三种: scalars (纯量), arrays
of scalars (纯量阵列), associative arrays (相关阵列?实在不会翻,看下
面的解好了)。
Arrays (of scalars) 与Associative arrays的差别:
"一般所谓的arrays是一块连续的记忆体,它的每一个元素的大小都是一样的,
可以很快的透过数字(第几号元素)利用CPU 本身的定址能力直接取出来;
而associative arrays比较像一张对照表,给定一个值(有可能是一个字串),
要先在这张表内搜寻,找到这个『键』,然後才能找到相对应的值出来。
差别就是arrays (of scalars)速度比较快, associative arrays通常都是
利用一些资料结构达成的,比较慢, 不过比较有弹性就是了。"
perl的变数不需要事先宣告,直接就可以用了。
变数以$ 开头, 以下是几个例子: (每一行都是独立互不相的)
$days # a simple scalar variable
$days[28] # 29th element of array @days
$days{'Feb'} # one value from an associative array
$#days # last index of array @days
一整个(或者是部份的)array用@表示:
@days # ($days[0], $days[1], $days[2], ...$days[n])
@days[3,4,5] # same as @days[3..5] 等於 ($days[3],$days[4],$days[5])
@days{'a','c'} # ($days{'a'}, $days{'c'})
一整个assosiative array用%开头:
%days # (key1, val1, key2, val2, ....)
对於每一种资料型态, 他们的命名空间是互相独立而不受扰的, 也就是说,
$days, @days, %days这三个符号可以同时存在而互不影响。
以上这八种表示法都可以作为lvalue, 换句话说, 都可以放在等号的左边,
可以设值。如下:
$d = 20;
$a[18]=1;
$days{'Feb'} =28;
@arr = ('a','b','c','d','e');
@days[3,4,5] = ( 1, 2, 3 );
@days{'a','c'} = ('Monday','Wednesday');
甚至: ($s1,$s2,$s3) = $Bar(2,3,4);
ps: 前面没有提到, 不过应该很简单, 就是常数array就是用小括号括起来形成一个
"list"就对了。字串就是用单引号或双引号括起来。详情见後面说明。
Array @classes 的大小可以由$#classes的值得到。(实际上是array长度减一,
因为$#classes是@classes最後一个元素的索引(index),而通常array都是从0开始
算的)。 要改变array的大小就直接改$#classe
Tags:Perl,简介

