Perl入门教程

Perl入门教程,第1张

2楼真是的,人家还没入门,你直接整个文件 *** 作干嘛?

什么是Perl?

Perl 是一种最初开发用于文本 *** 作的编程语言。现在它能应用于广泛的任务,包括系统管理、 web 开发、 网络编程、 GUI 开发和更多的普通用途。

这个语言以实用性为目标(易用、高效、完整)宁愿失去美丽(小巧、优雅、迷你)。它使用方便,且支持面向过程和面向对象编程,内置强大的文本处理支持,并有世界上最令人印象深刻的第三方模块的集中营。

运行Perl程序

在Unix命令行运行Perl程序:

perl prognamepl

另一种方法是,把这个放到你的脚本第一行:

#!/usr/bin/env perl

然后用/path/to/scriptpl运行。当然,首先得让它能执行,你得chmod 755 scriptpl(Unix下)。

(这里的第一行假设你有env程序。你也可以直接把你的perl解释器的路径直接放到第一行,比如#!/usr/bin/perl)

安全保障

默认情况下,Perl非常随意。为了使它更强健建议每个程序由下列行开始:

1 #!/usr/bin/perl

2 use strict;

3 use warnings;

附加的两行从perl中捕获您的代码中的各种常见的问题。它们检查不同的事情,所以你需要两个都加上。一个潜在的问题通过use strict;捕获,一旦它捕获到问题,会马上让你的程序停止运行。当然使用use warnings;时,仅仅出现警告(就好像命令行的-w选项)并不会停止程序。

基本语法概述

一个Perl脚本或程序包含一条或多条语句。这些语句只需直接写在脚本中,而不需要像main()这样的东西作为程序入口。

Perl语句以分别结束:

print "Hello, world";

以星号(#)开始的语句是注释:

# This is a comment(这是一条注释)

空白字符会被Perl忽略:

1 print

2 "Hello, world"

3 ;

……引号里的字符串除外:

1 # this would print with a linebreak in the middle

2 print "Hello

3 world";

字符串使用双引号或单引号:

1 print "Hello, world";

2 print 'Hello, world';

然而,只有双引号会“插入”变量值和像换行符(\n)这样的特殊字符(转义字符):

1 print "Hello, $name\n"; # works fine

2 print 'Hello, $name\n'; # prints $name\n literally

数字不需要引号:

print 42;

你可以使用或省略括号来传递函数的参数。它们只是在偶尔要改变或明确优先级的时候必须使用。

1 print("Hello, world\n");

2 print "Hello, world\n";

Perl变量类型

Perl有3种主要的变量类型:标量(scalars)、数组(arrays)和哈希(hashes)。

标量(Scalars)

一个标量表示只有一个值:

1 my $animal = "camel";

2 my $answer = 42;

标量的值可以是字符串、整数或浮点数,并且Perl会在需要的时候自动转换。你不需要预先声明你的变量类型,但是你需要在第一次使用它们的时候,使用my来声明它们。(这是use strict;所要求的)

标量可以用不用的方式使用:

1 print $animal;

2 print "The animal is $animal\n";

3 print "The square of $answer is ", $answer $answer, "\n";

有大量的“魔法”标量的名称看上去像标点或线路噪音。这些特殊的变量用于各种目的。现在你只要知道其中一个,这就是“默认变量”$_。它被许多Perl的函数用作默认的参数,并且它被隐式设置到某些循环结构中。

print; # prints contents of $_ by default(默认打印$_的内容)

数组(Arrays)

数组用于表示一些值的列表:

1 my @animals = ("camel", "llama", "owl");

2 my @numbers = (23, 42, 69);

3 my @mixed = ("camel", 42, 123);

特殊变量$#array将返回数组最后一个元素的索引:

print $mixed[$#mixed]; # last element, prints 123

你可能想使用$#array + 1来得到这个数组的元素个数。别急,这很容易。在Perl预想找到一个标量值的时候(“在标量上下文”),使用@array会得到数组的元素个数:(译注:“上下文”是Perl很重要的特性之一,请查阅相关文档或在无忧Perl搜索相关内容)

if (@animals < 5) { } #译注:当@animals数组的元素个数少于5个的时候

当我们从数组获得元素值的时候,需要使用$,因为我们只要获取数组里的一个值;你请求一个标量,然后会获得一个标量。

从数组里获取多个值:

(译注:获取多个值,使用@,因为我们要获取数组里的几个值(列表)。)

1 @animals[0,1]; # gives ("camel", "llama");

2 @animals[02]; # gives ("camel", "llama", "owl");

3 @animals[1$#animals]; # gives all except the first element

这叫“数组切片”。

你可以在列表里干些有意义的事情:

1 my @sorted = sort @animals;

2 my @backwards = reverse @numbers;

有两个特殊的数组,一个是命令行传到你脚本的参数@ARGV;另一个是传递给子程序的参数@_。

哈希

哈希用来表示键/值对:

1 my %fruit_color = ("apple", "red", "banana", "yellow");

你可以使用空白字符和=> *** 作符来美化上面的代码:

1 my %fruit_color = (

2 apple => "red",

3 banana => "yellow",

4 );

获取哈希元素:

1 $fruit_color{"apple"}; # gives "red"

你可以通过keys()和values()来获取键列表和值列表。

1 my @fruits = keys %fruit_colors;

2 my @colors = values %fruit_colors;

哈希没有特定的内部排序,然而你可以对键进行排序来遍历它。

和特殊的标量、数组一样,哈希也有特殊的。我们现在只要知道哈希%ENV包括所有环境变量

更复杂的数据类型可以使用引用来构造,允许你把列表和哈希放到另一个列表和哈希中。

引用是一个标量值,它可以引用任何其它的Perl数据类型。通过把引用存储为数组或哈希的元素值,你可以轻松创建列表/哈希中的列表/哈希。

以下示例演示了使用匿名哈希引用实现的两级哈希结构

1 my $variables = {

2 scalar => {

3 description => "single item",

4 sigil => '$',

5 },

6 array => {

7 description => "ordered list of items",

8 sigil => '@',

9 },

10 hash => {

11 description => "key/value pairs",

12 sigil => '%',

13 },

14 };

15

16 print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";

变量作用域

上面所有的例子都使用这种语法:

1 my $var = "value";

实际上,my不是必须的。你可以省略:(译注:前提是,你没有使用“use strict;”语句)

1 $var = "value";

但是,上面的用法将创建一个全局变量,这是一个很差的编程实践。my创建一个词法作用域变量,这个变量只在定义它们的语句块中可见(比如一段包在大括号里的语句)。

1 my $x = "foo";

2 my $some_condition = 1;

3 if ($some_condition) {

4 my $y = "bar";

5 print $x; # prints "foo"

6 print $y; # prints "bar"

7 }

8 print $x; # prints "foo"

9 print $y; # prints nothing; $y has fallen out of scope

结合使用my和在Perl脚本开头使用use strict,解释器将捕获常见的编程错误。比如,在上面的例子中,最后的print $y将引发一个编译时错误并阻止程序运行。强烈建议使用use strict语句!

条件和循环语句

Perl有许多常用的条件和循环语句。Perl 510甚至提供了分支语句(拼作given/when)。

条件可以是任何Perl表达式。比较和布尔条件语句中常用的逻辑运算符,请参阅有关信息的下一节中的运算符的列表。

if

1 if ( condition ) {

2

3 } elsif ( other condition ) {

4

5 } else {

6

7 }

还有否定版本的:

1 unless ( condition ) {

2

3 }

这个否定版比if (!condition)更易读。

注意,大括号是必须的,即使代码块中只有一行。不过,这里有一个方法可以让你通过类似英语的语法来实现单行条件语句:

1 # the traditional way

2 if ($zippy) {

3 print "Yow!";

4 }

5

6 # the Perlish post-condition way

7 print "Yow!" if $zippy;

8 print "We have no bananas" unless $bananas;

while

1 while ( condition ) {

2

3 }

为了和unless同样的理由,也有一个否定版本:

1 until ( condition ) {

2

3 }

你也可以在后置条件里使用while:

print "LA LA LA\n" while 1; # loops forever

for

跟C语言一样:

1 for ($i = 0; $i <= $max; $i++) {

2

3 }

自然Perl提供了更友好的列表遍历循环foreach以后,C语言风格的for循环在Perl几乎不需要了。

foreach

1 foreach (@array) {

2 print "This element is $_\n";

3 }

4

5 print $list[$_] foreach 0 $max;

6

7 # you don't have to use the default $_ either

8 foreach my $key (keys %hash) {

9 print "The value of $key is $hash{$key}\n";

10 }

内置 *** 作符和函数

Perl 附带了各种各样的内置函数。我们已经看到的几个,包括print,sort和reverse。

Perl常见 *** 作符(运算符)

算术

1 + 加法

2 - 减法

3 乘法

4 / 除法

数字比较

1 == 等于

2 != 不等于

3 < 小于

4 > 大于

5 <= 小于等于

6 >= 大于等于

字符串比较

1 eq 等于

2 ne 不等于

3 lt 小于

4 gt 大于

5 le 小于等于

6 ge 大于等于

(为什么数字和字符串的比较运算符不同?因为我们没有不同的变量类型,并且Perl需要知道是以数字进行排序(99小于100)还是以字母进行排序(100在99前面))

逻辑

1 && and 和

2 || or 或

3 ! not 否

混合

1 = 赋值

2 字符串连接

3 x 字符串乘法

4 范围 (建立一个列表)

一些 *** 作符可以和=结合,像这样:

1 $a += 1; # same as $a = $a + 1

2 $a -= 1; # same as $a = $a - 1

3 $a = "\n"; # same as $a = $a "\n";

文件和I/O

你可以使用open()函数来打开一个文件,用于输入或输出:

1 open(my $in, "<", "inputtxt") or die "Can't open inputtxt: $!";

2 open(my $out, ">", "outputtxt") or die "Can't open outputtxt: $!";

3 open(my $log, ">>", "mylog") or die "Can't open mylog: $!";

你可以使用<> *** 作符从打开的文件句柄中读数据。在标量上下文中,它从文件句柄中读取一行;在列表上下文中,它读取整个文件,并将每一行作为列表的元素。

1 my $line = <$in>;

2 my @lines = <$in>;

一次性把整个文件读完,叫做“啜食(slurping)”。它能让人满意,但它可能是内存吞噬者。大多数文本文件处理可以通过Perl的循环结构,一行一行地完成。

<> *** 作符经常出现在while循环里:

1 while (<$in>) { # assigns each line in turn to $_

2 print "Just read in this line: $_";

3 }

我们已经看到了如何使用print()在标准输出里打印。但是,print()还能通过第一个可选参数指定一个文件句柄来打印(译注:将内容输出到指定的文件句柄中,即写入到文件句柄相关联的文件中)

1 print STDERR "This is your final warning\n";

2 print $out $record;

3 print $log $logmessage;

当你完成了对文件句柄的 *** 作之后,你应该使用close()来关闭文件句柄。(老实说,如果你忘记关闭了,Perl会帮你处理。)

close $in or die "$in: $!";

正则表达式

Perl对正则表达式的支持宽广而深入:

简单匹配

1 if (/foo/) { } # true if $_ contains "foo"

2 if ($a =~ /foo/) { } # true if $a contains "foo"

//匹配 *** 作符(译注,完整的应该是:m//)默认 *** 作$_,或者使用=~来绑定其它变量进行 *** 作。

简单置换

1 s/foo/bar/; # replaces foo with bar in $_

2 $a =~ s/foo/bar/; # replaces foo with bar in $a

3 $a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar in $a

更复杂的正则表达式

你不仅能匹配固定的字符串。其实,你可以匹配任何你能想到的复杂正则表达式。

1 单个任意字符(默认不包含\n)

2 \s 一个空白字符 (空格, tab, 换行, )

3 \S 一个非空白字符

4 \d 一个数字 (0-9)

5 \D 一个非数字

6 \w 一个能组成单词的字符 (a-z, A-Z, 0-9, _)

7 \W 一个不能组成单词的字符

8 [aeiou] 匹配中括号内的任意一个字符

9 [^aeiou] 匹配除了中括号内列出的字符之外的任意一个字符

10 (foo|bar|baz) 匹配foo或bar或baz

11

12 ^ 匹配开头

13 $ 匹配结尾

量词可用来指定数量:

1 零个或任意多个

2 + 至少一个

3 零个或一个

4 {3} 3个

5 {3,6} 3到6个

6 {3,} 至少3个

一些简单的例子:

1 /^\d+/ 以一个或多个数字开头

2 /^$/ 空的,没有任何东西

3 /(\d\s){3}/ 3个带空白字符的数字

4 (比如 "3 4 5 ")

5 /(a)+/ 匹配最少一次,含有a和任意字符

6 (比如 "abacadaf")

7

8 # 从STDIN循环读入,并打印出非空白行:

9 while (<>) {

10 next if /^$/;

11 print;

12 }

圆括号捕捉

括号的另一个用法是分组。它可以用来捕捉最后使用的正则表达式匹配的结果。这些结果用$1、$2……表示。

1 # a cheap and nasty way to break an email address up into parts

2

3 if ($email =~ /([^@]+)@(+)/) {

4 print "Username is $1\n";

5 print "Hostname is $2\n";

6 }

子程序

写一个子程序是很容易的:

1 sub logger {

2 my $logmessage = shift;

3 open my $logfile, ">>", "mylog" or die "Could not open mylog: $!";

4 print $logfile $logmessage;

5 }

现在我们可以像使用其它内置函数一样,使用该子程序了:

1 logger("We have a logger subroutine!");

什么是shift?传递给子程序的参数保存在@_数组中。shift函数的默认参数是@_。所以my $logmessage = shift;去掉第一个参数,并将其赋值给$logmessage。

可以通过别的方法 *** 作@_:

1 my ($logmessage, $priority) = @_; # common(通用)

2 my $logmessage = $_[0]; # uncommon, and ugly(不通过,并且很丑陋)

子程序可以返回值:

# sub square {

# my $num = shift;

# my $result = $num $num;

# return $result;

# }

然后像这样使用它:

1 $sq = square(8);

Perl面向对象

Perl面向对象相对比较简单,这是实现使用引用什么样的对象知道自己是在Perl的概念为基础的封装。

刚开始进行Perl编程,你最常使用的Perl面向对象将是使用第三方模块,参见下文。

使用Perl模块

Perl 模块提供了一系列的功能,可帮助您避免重复劳动,它们可以通过CPAN(>水平有限,错误难免,欢迎指正,并以原文为准。原文地址:>

perl命令行参数怎么捕获? perl 获取命令行参数方法,以在windows *** 作系统为例,当我们在命令行中调用PERL程序的时候,我们往往会跟随一些参数,比如输入文件名,和输出文件名之类的信息。这些信息PERL会将它们存储在@ARGV数组中(和C语言一样)。比如在cmd中输入如下命令:

pppl -opcamfile opcamfileini -rcfile rcfiletxt -swapfile swapfiletmp -outfile outfiletxt

PERL会建立一个数组@ARGV=qw/-opcamfile opcamfileini -rcfile rcfiletxt -swapfile swapfiletmp -outfile outfiletxt/;然后我们想把这些信息做何用出就对应的处理数组,从数组中分离我们想要的数据就可以了。如下面的代码所示。shift的默认参数是@ARGV。

while ($#ARGV > -1) {

if ($ARGV[0] =~ /-opcamfile/i){

if ($ARGV[1] !~ /-/) {

$opcamfile = $ARGV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-rcfile/i) {

if ($ARGV[1] !~ /-/) {

$rcfile = $ARGV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-swapfile/i) {

if ($ARGV[1] !~ /-/) {

$swapfile = $AR GV[1];

shift;

}

shift;

} elsif ($ARGV[0] =~ /-outfile/i) {

if ($ARGV[1] !~ /-/) {

$outfile = $ARGV[1];

$outfile =~ s/_sim//g;

shift;

}

shift;

} else {

die 'Unrecognized argument, Exiting';

}

}

1)产生变化内容的程序例子(genlogpl)

CODE:

use IO::Handle;

open (FD, "> /tmp/testlog") or die $!;

FD->autoflush(1);

while (1) {

my $now = time;

print FD $now, "\n";

sleep 1;

}

close FD;

这个小程序在/tmp目录下产生一个testlog的临时文件,并且每隔1秒写入当前时间的unix 时间戳

因此用普通的tail命令可以看到/tmp/testlog的内容是不断增长的。要注意的是红色的那行将

文件描述FD设置为自动冲刷(缓冲区),因此凡是写入的信息都立刻同步到磁盘,如果没有这行

那么写入的内容不能立刻反应到testlog里。

下面我们来设计一个读取这个增长内容的小程序。

2)perl版tail

CODE:

open (FD, "< /tmp/testlog") or die $!;

while (1) {

my $in = <FD>;

print $in;

}

close FD;

这个程序更简单。只要可读,将不断的读取/tmp/testlog的内容。通过这2个小程序,就演示了

如何监视不断增加的日志的方法。

标量是一个简单的数据单元。标量可以是一个整数,浮点数,字符,字符串,段落或者一个完整的网页。

1 数字标量

2 字符串标量

注意单引号和双引号的区别

3 标量运算

4 多行字符串

5 特殊字符

如: __FILE__ , __LINE__ , 和 __PACKAGE__ 分别表示当前执行脚本的文件名,行号,包名。

这些特殊字符是单独的标记,不能写在字符串中,例如:

6 v字符串

一个以v开头,后面跟着一个或多个用句点分隔的整数,会被当作一个字串文本。

当你想为每个字符 直接声明其数字值时,v-字串提供了一种更清晰的构造这类字串的方法,而不像 "\x{1}\x{14}\x{12c}\x{fa0}" 这种不易于理解

Perl数组是一个存储标量值的列表变量,变量可以是不同类型。

数组变量以 @ 开头。访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取

1 创建数组

数组变量以 @ 符号开始,元素放在括号内,也可以以 qw 开始定义数组

@array = (1, 2, 'Hello');

@array = qw/ 这是 一个 数组/;

第二个数组使用 qw// 运算符,它返回字符串列表,数组元素以空格分隔。当然也可以使用多行来定义数组:

@days = qw/google

taobao

runoob/;

也可以按索引来给数组赋值,如下所示:

$array[0] = 'Monday';

$array[6] = 'Sunday';

2 访问数组元素

访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:

数组索引值从 0 开始,即 0 为第一个元素,1 为第二个元素,以此类推。

负数从反向开始读取,-1 为第一个元素, -2 为第二个元素

3 数组序列号

Perl提供了可以按序列输出的数组形式,格式为 起始值 + + 结束值

4 数组大小

数组大小由数组中的标量上下文决定的,数组长度返回的是数组物理大小,而不是元素的个数

5 添加和删除数组元素

Perl提供了一些有用的函数来添加和删除数组元素: push, pop, shift, unshift

实例:

6 切割数组

数组索引需要指定有效的索引值,可以是正数后负数,每个索引值使用逗号隔开。

如果是连续的索引,可以使用 来表示指定范围:

7 替换数组元素

Perl中数组元素替换使用splice()函数,语法格式如下:

splice(@array, offset, length, list)

参数说明:

@array:要替换的数组

offset:起始位置

length:替换的元素个数

list:替换元素列表

实例:

8 将字符串转换为数组

Perl中将字符串转换为数组使用split()函数, 语法格式如下:

split(pattern, expr, limit);

pattern:分隔符,默认为空格。

expr:指定字符串数。

limit:如果指定该参数,则返回该数组的元素个数。

9 将数组转化为字符串

Perl中将数组转换为字符串使用join()函数,语法格式如下:

join(expr, list);

参数说明:

EXPR:连接符。

LIST:列表或数组。

10 数组排序

Perl中数组排序使用sort()函数,语法格式如下:

sort(subrountine, list);

参数说明:

SUBROUTINE:指定规则。

LIST:列表或数组。

实例:

注意:数组排序是根据ASCII数字值来排序。我们在对数组进行排序时,最好先将每个元素转换成小写后再排序。

11 特殊变量:$[

特殊变量 $[ 表示数组的第一索引值,一般都为0, 如果将 $[  设置为1,则数组的第一索引值即为1,第二个为2,以此类推

实例:

一般情况不建议使用特殊变量 $[ ,在新版 Perl 中,该变量已废弃。

12 合并数组

数组的元素是以逗号来分割,我们也可以使用逗号来合并数组,如下:

13 从列表中选择元素

一个列表可以当作一个数组使用,在列表后指定索引值可以读取指定的元素:

哈希是key/value对的集合。 Perl中哈希变量以百分号(%)标记开始。

访问哈希元素格式:${key}

1 创建哈希

一,为每个key设置value

$data{'google'} = 'googlecom';

$data{'w3cschool'} = 'w3cschoolcn';

二,通过列表设置

(1) 列表中第一个元素为key, 第二个元素为value

%data = ('google', 'googlecom', 'w3cschool', 'w3cschoolcn', 'taobao', 'taobaocom');

(2) 也可以使用=>符号来设置key/value

%data = ('google'=>'googlecom', 'w3cschool'=>'w3cschoolcn', 'taobao'=>'taobaocom');

(3) 使用 - 来代替引号

%data = (-google=>'googlecom', -w3cschool=>'w3cschoolcn', -taobao=>'taobaocom');

实例:

2 访问哈希元素

访问哈希元素的格式:${key}

3 读取哈希值

哈希值提取数组 ,语法格式为:@{key1, key2}

4 读取哈希的key和value

读取所有key

可以通过使用 keys 函数读取 哈希所有的键值,语法格式如下:

keys %hash

可以使用 values 函数来读取哈希所有的值,语法格式如下:

values %HASH

5 检测元素是否存在

如果在哈希读取不存在的key/value对,会返回undefined值,且执行时会有警告提醒。为了避免这种情况,可以使用 exists 函数来判断key是否存在,存在的时候读取

6 获取哈希的大小

哈希大小为元素的个数,我们可以通过key或value的所有元素数组,再计算数组元素多少来获取哈希大小

7 哈希中添加或删除元素

添加key/value对可以通过简单的赋值来完成。但是 删除哈希元素需要使用 delete 函数

以上就是关于Perl入门教程全部的内容,包括:Perl入门教程、Perl 如何处理 返回多个游标的DB2存储过程、perl命令行参数怎么捕获等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9351420.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存