Perl 是一门开源的脚本语言,由 Larry Wall 所创造,该语言以实用,快速开发为主要目标,与当前流行的面向对象结构化编程有些格格不入,但这并不妨碍 Perl 被广泛流传和使用,世界范围内围绕 Perl 建立起了非常活跃的社区,很多人在其中不断帮助完善文档,创建示例代码,提供一些第三库等等。具体可以浏览以下两个网页:www.cpan.org , www.perl.com.

Perl 最出名也最擅长的要数文本处理了,很多其它语言要花几十上百行代码才能完成的任务,Perl 可能只需要几行代码就能完成。但这些优势是有代价的,Perl 书写代码的风格有时常常被诟病,典型的面向过程式语言,各种眼花缭乱令人头疼的符号,甚至 Perl 一直以来所坚持的哲学:只要不引起冲突误解,代码可以写成多种形式(There's More Than One Way To Do It)。这导致 Perl 在语法上具有非常松散随意的特点:同一件事情常常有多种不同的写法,有些看起来还很奇特,体现在语法上,Perl 的符号特别多,让 Perl 在一定程度比较难学易忘。

本文主要简单介绍一下 Perl 的基本语法,目的是通过本文,你能了解 Perl 基本的写法,能够顺利的去读别人的代码。天下的语言在一定程度上是相通的,如果有一门语言的基础,去学另一本语言,入门基本不会太难(函数式除外吧。。。),但要用到熟,用到得心应手,第三库的使用等,这些就需要耐心以及假以时日了。本节主要介绍一下各种数据类型.


<一> 语句及注释:

Perl 语句以分号(;)结尾,用 # 作为一行的注释,没有其它语言中那种跨行的注释。代码块用大括号围起来,这个和 C 类似,但这个大括号在有些地方是强制要求,如在 if ,for,do, while 等语句中,它不像其它语言一样会用缩进来判断块。


<二> 变量: 标量(scalar) & 列表(list)

Perl把简单的数据类型,如字符串,数字等“单数”的东西统称为标量,与之相对的,就是“复数”的东西,如数组。标量的声明都是 $ 开始,如:  $str = "abc"。多个标量也可以放一处一起声明:

($x, $y, $z) = (11, 22, "no", 4);

而数组的声明则是以@开头,如:@arr = ("abc","edf")。变量的声明和很多其它脚本语言一样,不需要指明类型,直接声明赋值就可以使用。如果只声明但不赋值,Perl 会默认给它赋值为:undef。

为了检查一个变量是否已被赋值,Perl 提供了一个操作符:defined,用于判断一个变量是否已经被赋值:

     if( !defined( $myvar ) ) 

    {

       print "uninitialized variable";

    }  


<三> 字符串

(1) 基本语法

在 Perl 中,所有字符串都是双引号或单引号括起来的,如: "string"  'string'。这两种方式在很多时候相同,不同的是当字符串出现其它变量或转义符号的时候,双引号会将变量的内容展开,而单引号的不会,这和 shell script 是相似的,如:

       $var = 234;

       $str1 = "str1:$var";    # 打印出来得到-> str1:234

       $str2 = 'str2:$var';     # 打印出来得到-> str2:$var

(2) 字符串拼接

点号(.)用于把字符串进行拼接,这个和其它一些语言直接把字符串连在一起就行不一样,要用点号把字符串连起来,如:

$str = "abc"."efg";  # abcefg

很巧,这个用法,和 shell script , vim script 也是一致的。

(3) 比较

这里需要强调的,字符串的比较要用:

  • lt    小于 (Less Than)
  • gt   大于 (Greater Than)
  • eq   等于  (Equal)

而不要用== , >=  , <= ,这些符号是用来比较数值类型的。


<四> 数组

(1) 声明

如前所说,数组是一个复数(plaural)形式的变量,它的声明是以@开头的,后面跟着小括号放入初始值:

@arr = (12,34,56);

同一个数组里的元素类型不一定要一样,下面的写法也是合法的:

@arr = (12,"abc",'c');

当然,也可以声明空数组:

@arr = ();

声明字符串数组时,可以用 q,qq,qw 系列操作符简化操作。q 代表 quoted,  qw 代表: quoted word.

@arr = qq(abc);   # 等价于 ("abc")

@arr = qw(abc ef gg);   # 等价于("abc","ef","gg")

@arr = q(abc);    # 等价于('abc')

由上看出 qq 与 qw 的区别就在于,qq 是将括号中的整个内容当成一个整体加上双引号,而 qw 是以空格为分隔,如上第二个例子,abc, ef, gg 分别被加上了双引号,而 q 与 qq 相似。这几个操作符的好处在于,当你想在字符串加入转义符号,引号等符号时,会方便很多。

qq(\abc)  eq  “\\abc"

qq("abc") eq ”\"abc\""


(2) 数组访问,插入

如果想访问数组里的元素,就用中括号加下标的方法,和很多其它语言一样,perl的数组元素从0开始算:

print $arr[2];

有人可能注意到了,引用里面元素的时候,又用了$,而不是@。这里其实有一个原则,用@时,是表示整个数组,而引用其中的元素时,就用 $,后面将讲到hash类型数组,也是同样的原则。上面是一次访问一个元素,如果需要取出 sub array(切片), 则应如下写:

@sub_arr = @arr[1,4];

Perl 中的数组是没有指定大小的,如果访问了没有定义的元素,就会返回 undef:

@arr = (1,2,3);

$ele = $arr[20]; # ele == undef

如果要往数组中加入新元素,也可以直接用中括号+下标:

$arr[4] = 4; #如果不存在第4个元素就插入,存在就覆盖。

(3) 转换

下面提一个很体现 Perl 风格的问题,前面说到,用@引用 一个数组时,表示对整个数组的引用,但这种引用在不同场合下(context)是表示不同含义的:

@arr = ("abc", "ed");

print "arr: @arr" ;

上面的 print 会将 arr 中的元素一个个的提取出来展开打印,这个好理解,但如果我这样写呢:

$sz = @arr;  #

把数组赋值给一个标量,Perl 会把数组的大小赋值给左边的变量,所以上面的例子里,$sz 等于2。如果Perl没法判断,当前上下文是标量还是数组,默认情况下,@arr 都会展开数组:

@arr2 = (1,2,@arr);  # arr2 == (1,2,"abc","ed").

但如果这时候,我是想让 @arr 当作标量来处理,怎么办?上面的写法是不行的。Perl 规定,如果想要指明转换为标量类型,就需要加上关键字: scalar.

@arr2 = (1,2,scalar @arr);  # arr2 == (1,2,2)


(4) sort 排序功能

Perl 为数组提供了排序操作符:sort。默认情况下,sort 对数组里的元素按字母排序,然后返回一个新的数组,旧数组不变。

@arr = ("abc","rsz","ef");

@newarr = sort(@arr);

#  arr = abc rsz ef    newarr = abc ef rsz.

如果数组里存的不是字符,或你不想按字符序排序, 可以指定按数字的方式排序。

sort ({$a <=> $b} @array)

大括号表示一个比较函数,<=> 是指数值比较,$a 和 $b 表示比较的两个数,这两个变量是语言预定义的变量不可以更改。如果把a,b的顺序调换一下,就表示反过来排序,如果用了数值排序,而数组中又有字符串元素,那字符串都被当作 0,如果有多个字符串,字符串之间仍按字母序来排序。如:

@arr = (22,44,33,-12,gg ,hh)

sort({$a<=>$b @arr);  #   结果:-12 gg hh 22 33 44


(5) 插入,删除。

Perl 提供了 push, pop, shift, unshift 等函数对数组进行入栈出栈之类的操作。push 和 pop 作用在尾部,shift 与 unshift 作用在头部。

@arr = ("ab","bc","ee");

pop @arr;   # 结果:("ab","bc")

push(@arr,"hh");  #结果: ("ab","bc","hh")

shift @arr;   #结果:  ("bc","hh")

unshift(@arr, "vv"); #结果: ("vv","bc","hh")


<五> hash 数组

(1) 声明与初化

Perl 里的 hash 数组类似于 python 里的 dict, c++ 中的 map。数组中保存的是 <key,value> 一对值。hash 数组用 % 来声明

%hash = ("key1","value1","key2","value2");

print "v1:$hash{key1}";  #打印出:value1.

上面的初始化语句在 key,value 很多时可读性很差,因此,Perl 又提供了另一种写法:

%hash = ("key1"=>"value1","key2"=>"value2");

其中符号 => 与逗号的效果是完全一样,但这种写法看起来,就比较容易分辨别哪个是 Key, 哪个是 value.


(2) 插入,删除与修改

hash 的插入与修改在语法上是完全一样的。

$hash{"key"} = "value";

如果 hash 数组中原来没有 “key”,就插入;如果有"key"及相应"value",如果原来有相应的 "key",就修改相应的 value 为新的 “value"。与此同时,Perl 提供了一个 delete 操作符来删除 hash 中的元素,如: delete $hash{"key"};


(3) 获取 key 与 value.

Perl 提供了keys 和 values 这两个函数来获取 hash 中的全部 key,value。这两个操作符返回的是一个数组,如:

%hash = ("k1"=>"v1","k2"=>"v2");

@k = keys (%hash);    #k == ("k1","k2")

@v = values(%hash);   #v == ("v1","v2")


下面介绍一下分支循环控制及IO。

Perl中的分支循环在语法上和C家庭语言的语法很相似,关键字包括: If / else, for ,while 。

前面已经讲过,Perl中代码块用大括号{}围起来,表达式以分号结尾,这些都和C相似,但在Perl中,使用if for while时,大括号是强制要求的,这点与c不一样。细心的人可能会发现前一节讲数据类型的时候,并没有涉及到整形,浮点,bool什么的,只说到了一个标量,事实上在Perl里,这些基本数据类型并不严格区分,都可以归到Scalar里头去,这也大概算是脚本语言的一个通用做法, 弱化了基本类型。

其它先不提,分支循环在很多语言里有一个很关键的数据类型:bool。控制分支走向需要一个判断点,真要怎样做,假要怎样做,但在Perl里,没有一个具体的true,false类型,所以在做真假判断时,遵循以下原则:

  • 如果是数据类型,0则为假,
  • 如果是字符串,空字符串为假。
  • 如果是集合,空集合为假。

这些都比较好理解。


(一) if / else

Perl中的if/else语法上和c语言一致,除了要求一定要有大括号。

逻辑判断操作: 与(&&), 或(||),非(!) 语法上也很和C是一致的。

$str = "abc";

@arr = (2,3,4);

if( $str && @arr == 3)

{

}

else

{

}

上面的例子是一种比较传统老式的写法,前面我说if / else 和C中的语法一致,其实也不大准确。

Perl自己还提供了一套与C不大一样的写法,风格上更像是自然语言一样。

$var = 2;

Print " hello world" if ($var > 0); #注意这行,等价于:   if ($var > 0) { print "hello world";}

这种写法就像是自然语言里的倒序了。

像上面这种写法,还有另外一个关键字也是同样适用的: unless

Print " hello world" unless ($var > 0);


(二) 循环: for / while / foreach

for ($i=0; $i<100; $i++)

       {

print "hello $i \n";
       }

while( $i < 100 )

{

print "hello $i \n";

$i++;

}

上面两字例子演示了 for / while的写法,可见是和C 在语法上是一样的。

除了for / while ,Perl还提供了一个 foreach 专门用来处理数组。

@arr = (1,2,3,4,5);

foreach $item (@arr)

{

print "item: $item\n";

}

注意foreach 那一行中的小括号是不能省的。


(三) I/O

Perl中进行I/O操作延用了unix中的IO概念,一切都抽象成文件。

所以,I/O操作都是对一个文件句柄(file handle)进行操作,包括标准输入标准输出。


 (1) 标准输入,标准输出

前面示例代码中多次用到了print,在之前的写法这是标准输出,但它的功能却不仅限于标准输出,事实上它的准确原型是:

print <file handle> "hello world\n";

如果省略了 file handle,默认情况下就是标准输出,标准输出的句柄 <STDOUT>

所以前面的print语句,事实上等价于:

print STDOUT "hello world\n";

对应的标准输入是STDIN, 这个两个变量是Perl预定义的。

可以看成是一个关键字一样,也不需要在这些变量前面加$,@这类的符号 。

前面一直只示例了标准输出,没有提过标准输入。

标准输入语法上,也很简洁:

$line = <STDIN>; #read

用尖括号把文件句柄括起来,就相当于从里面读数据。


(2) 文件I/O

获取及关闭文件要用Open()/Close()函数。

$succ=  open(fh,“~/myfile.log”);

if($succ)

{

$line = <fh>;#read one line.

@all = <fh>;  #read the whole file.

print "@line \n";

close(fh);

}

值得注意的是,文件句柄的声明是可以不用加$这种符号,直接写一个名字就够了,当然,你如果喜欢加上$,也是没问题的。

前面的示例演示了读入时的最基本的做法,Perl还提供了和C语言里类似的文件操作函数:seek, tell,

用来定位到文件的相应位置进行读写。

它们的用法和c语言很相似,具体使用方式,有兴趣的读者可以自己去查阅一下官方文档

前面的open()函数示例了文件打开的最基本形式,事实上,这个函数l还支持设置访问模式。

文件访问模式:

访问模式                         例子                                                  说明

读(Read)                        open(FH,"< FileName");               从文件中读取

写(Write)                        open(FH,"> FileName");              向文件中写入,覆盖旧文件中的内容

追加(Append)                 open(FH,">> FileName");           向现有文件的尾部追加数据

读写(Read and Write)     open(FH,"+< FileName");           读取和写入现有文件

写入程序                          open(PIPEOUT,"| pipeout");        打开程序管道

读取程序                          open(PIPEIN,"pipein |");              从程序或命令的输出中取得数据

如果打开的文件支持写操作,我们就可以用Print 函数往文件里写东西:

if(open(fh,">~/file.log"))

{

print fh "hello file\n";

close(fh);

}

Perl入门的更多相关文章

  1. Perl入门(四)Perl的正則表達式

    正則表達式是Perl语言的特色.主要的语法不是非常难,可是编写一个符合需求.高效的正則表達式.还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正則表達式内容/; 作用:查找匹配内容中是 ...

  2. perl入门知识(3)

    引用       在很多场合下使用引用传值,能在很大程度上提高代码的运行效率.       定义一个引用在变量名前加”\”就可以了,如:       $ra=\$a;       $rb=\@b;   ...

  3. perl入门知识(2)

    交互式编程你可以在命令行中使用 -e 选项来输入语句来执行代码,实例如下:$ perl -e 'print "Hello World\n"'输入以上命令,回车后,输出结果为:Hel ...

  4. perl 入门知识(1)

    <一> 语句及注释: Perl 语句以分号(;)结尾,用 # 作为一行的注释,没有其它语言中那种跨行的注释.代码块用大括号围起来,这个和 C 类似,但这个大括号在有些地方是强制要求,如在 ...

  5. Perl入门(七) Perl脚本的调试

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/sunshoupo211/article/details/32711165 编程中错误不可避免.调试可 ...

  6. 1章 perl入门

    1.标量数据    单变量    数字和字符串两种情况 2.所有数字的内部格式都相同.浮点型   perl中没有应对整数值得运算   . 3.浮点数直接量 数字e表示10的次方标示符 例子:-6.5e ...

  7. Perl入门 - Perl方法的使用

    1.定义一个方法 Perl使用sub定义方法. 语法: sub 方法名称{方法体} 2.调用一个方法 Perl直接使用方法名称调用方法. 调用方式有以下四种: 方法名称: &方法名称: 方法名 ...

  8. Perl入门(四)Perl的正则表达式

    正则表达式是Perl语言的特色,基本的语法不是很难,但是编写一个符合需求.高效的正则表达式,还是有一些挑战的. Perl的三种匹配模式 1.查找 语法:m/正则表达式内容/; 作用:查找匹配内容中是否 ...

  9. Perl入门(三)Perl的数组

    Perl数组的声明方式 Perl使用"@"符号声明一个数组:@array: 使用"()"或"qw()"声明数组中元素: 一个完整的声明方式为 ...

随机推荐

  1. sharepoint 2013 升级要求

    1. 安装过程合理: A. 可以同时在管理中心.两台前端.搜索服务器上安装重新发布的SP1补丁包(所提供的链接) B. 等待所有SP1补丁包安装完成,依次在管理中心.两台前端.搜索服务器上运行配置向导 ...

  2. epoll好文章

    https://www.cnblogs.com/apprentice89/p/3234677.html https://www.jianshu.com/p/aa486512e989 https://c ...

  3. Android 的一些中文文档

    https://blog.csdn.net/qq_36467463/article/details/77990089    //安卓mediaformat api详解 https://www.cnbl ...

  4. Spring框架注解

    这四个注解,功能都是一样的,都是用来创建对象的. 但是为什么有这么四个吗?Spring中提供了三个@Component的衍生注解:(功能目前来讲是一样的) @Controller      :WEB层 ...

  5. memcache内存存储

    memcache的内存分配默认是采用了Slab Allocator的机制分配.管理内存.在该机制出现以前,内存的分配是通过对所有记录简单地进行malloc和free来进行的. 但是,这种方式会导致内存 ...

  6. CentOS7基础建站指南(笔记)

    由于前段时间腾讯云打折,所以买了一台小服务器,想着以后写几个小网站,博客什么的,但是一开始就遇到了难题,大概就是Linux服务器的配置问题,比如如何假设服务器,配置非root用户,配置服务器数据的非r ...

  7. Java网络编程以及简单的聊天程序

    网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...

  8. Settings app简单学习记录

    Settings是android系统设置的入口.主界面由Settings.java以及settings_headers.xml构成. Settings类继承自PreferenceActivity,而P ...

  9. 【3】JMicro微服务-服务超时,重试,重试间隔

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  10. leetcode-73-矩阵置零

    题目描述:   给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1, ...