官网提供的入门链接:http://perldoc.perl.org/perlintro.html

语法概述

  • Perl的安装步骤省略,直接去官网下载并按照提示安装即可。
  • 如果Perl安装没问题,那么运行一个Perl脚本的步骤是在命令行中输入:

perl progname.pl

其中progname.pl是相应的Perl脚本。

  • 脚本的开头通常包含以下两行,第一行使得脚本运行过程中遇到问题时可立即停止在相应的位置,第二行将在遇到问题的地方给出一个warning。

use strict;

use warnings;

  • Perl语句与很多语言一样,以半角分号;作为结尾。
  • 注释符:#
  • 在双引号中加变量,而不是单引号,如:

print "Hello, $name\n";

变量类型

  • Perl有三种主要的变量类型:scalars,arrays,hashes,分别是标量、数组、哈希。
  • Scalar用于表示一个值,可以是字符串、整型或浮点型,以$作为开头。

my $animal = "camel";

my $answer = 42;

  • Scalar在第一次使用时需要用关键字my进行声明(use strict里规定的):

my $animal;

  • $_可表示默认变量,作为函数的默认参数,如读取文本文件时,每一行可以用$_表示。
  • Array用于表示一系列的值,这些值也可以是任意类型,以@作为开头,需要注意的是数组为0索引:

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

print $animals[0]; # prints "camel"

  • $#animals表示数组animals的最后一个元素的索引,上面这个例子的结果为2,即对应"owl",因此数组数目可用$#animals+1表示,用法如下:

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

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

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

  • 数组排序或反转:

my @sorted = sort @animals;

my @backwards = reverse @numbers;

  • 特别的数组:@ARGV,命令行参数;@_,传递到子函数的参数。
  • Hash用于表示一组键值对,以%作为开头,下面的例子中,%fruit_color表示一个哈希,apple和banana对应哈希的键(key),red和yellow对应哈希的值(value)。

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

  • 更清晰的写法是:

my %fruit_color = (

apple => "red",

banana => "yellow",

);

  • 获取某个键对应的值:

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

  • 也可以获取一组键或一组值,以数组的方式存储:

my @fruits = keys %fruit_colors;

my @colors = values %fruit_colors;

  • 特别的哈希:%ENV,包含环境变量。

变量作用域

  • 变量的声明时,在变量的前面加my表示该变量为局部变量,仅在代码块(如花括号中)起作用,不加my表示该变量为全局变量,在整个代码中均存在。如果my使用不恰当,如在代码块外使用代码快内声明的局部变量,则会报错(使用strict后)。

条件和循环结构

  • if条件判断

if ( condition ) {

...

} elsif ( other condition ) {

...

} else {

...

}

  • 还可以这样表示if (!condition):

unless ( condition ) {

...

}

  • 上面两种方法中,if或unless后面必须包括花括号,下面是单行的写法:

# the traditional way

if ($zippy) {

print "Yow!";

}

# the Perlish post-condition way

print "Yow!" if $zippy;

print "We have no bananas" unless $bananas;

  • while循环:

while ( condition ) {

...

}

  • 也可以这样表示while(!condition):

until ( condition ) {

...

}

  • while的单行写法:

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

  • for循环,写法与C语言相同:

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

...

}

  • foreach在Perl中更常用:

foreach (@array) {

print "This element is $_\n";

}

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

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

foreach my $key (keys %hash) {

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

}

  • Hash按key排序:

foreach my $key (keys sort %hash) {

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

}

内置运算符与函数

  • 算术:

+ addition

- subtraction

* multiplication

/ division

  • 数值比较:

== equality

!= inequality

< less than

> greater than

<= less than or equal

>= greater than or equal

  • 字符串比较:

eq equality

ne inequality

lt less than

gt greater than

le less than or equal

ge greater than or equal

  • 布尔逻辑,下面两列都可以表示:

&& and

|| or

! not

  • 其它:

= assignment

. string concatenation

x string multiplication

.. range operator (creates a list of numbers or strings)

  • 为什么要把数值比较和字符串比较分开:Perl没有指明变量类型,例如,在比较99和100时,Perl需要对它们进行排序,然而,若按数值排序,100>99,但按字母表排序,100在99的前面(1<9)。

文件与输入输出

  • 运算符<表示输入,>表示输出,>>表示追加:

open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";

open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";

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

  • scalar变量:逐行读取,array变量:一次性全部读取(占用很多内存):

my $line = <$in>;

my @lines = <$in>;

  • 通常用while循环逐行读取:

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

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

}

  • 输出到文件:

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

print $out $record;

print $log $logmessage;

  • 文件句柄访问结束后,通常需要关掉,但其实Perl会帮你做这件事情的,以防你忘记(好有爱),但为了统一最好还是要加上close:

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

正则表达式

  • Perl最强大的莫过于对正则表达式的有力支持了,可在perlrequick、perlretut和perlre中详细了解,下面只是简单描述。
  • 简单的匹配(match),//表示匹配运算符:

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

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

  • 简单的替换(substitution),s///表示替换运算符,后面加g表示替换所有:

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

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

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

  • 更复杂的正则表达式,可匹配不同的字符串:

. a single character

\s a whitespace character (space, tab, newline, ..)

\S non-whitespace character

\d a digit (0-9)

\D a non-digit

\w a word character (a-z, A-Z, 0-9, _)

\W a non-word character

[aeiou] matches a single character in the given set

[^aeiou] matches a single character outside the given set

(foo|bar|baz) matches any of the alternatives specified

^ start of string

$ end of string

  • 匹配数目:

* zero or more of the previous thing

+ one or more of the previous thing

? zero or one of the previous thing

{3} matches exactly 3 of the previous thing

{3,6} matches between 3 and 6 of the previous thing

{3,} matches 3 or more of the previous thing

  • 一些简单的例子:

/^\d+/ string starts with one or more digits

/^$/ nothing in the string (start and end are adjacent)

/(\d\s){3}/ three digits, each followed by a whitespace character (eg "3 4 5 ")

/(a.)+/ matches a string in which every odd-numbered letter is a (eg "abacadaf")

  • 去空行:

# This loop reads from STDIN, and prints non-blank lines:

while (<>) {

next if /^$/;

print;

}

  • 捕捉:

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

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

print "Username is $1\n";

print "Hostname is $2\n";

}

子函数

  • 子函数格式:

sub logger {

my $logmessage = shift;

open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";

print $logfile $logmessage;

}

  • 调用子函数:

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

  • 上面的shift是什么?子函数的参数可以是一个特殊的数组@_,shift函数的默认参数恰好是@_。@_还可以这样用:

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

my $logmessage = $_[0]; # uncommon, and ugly

  • 子函数也可以返回值:

sub square {

my $num = shift;

my $result = $num * $num;

return $result;

}

  • 可返回值的子函数用法如下:

$sq = square(8);

以上便是Perl入门需要掌握的一些基础了,这份入门材料只是简化版本,在实际工作中用到哪些知识再进行搜索就行,Perldoc还是挺全面的。

后面我也会更新一些工作中用到的知识。

joey_suAT163.com

2015/11/14

2.Perl基础系列之入门的更多相关文章

  1. 1.Perl基础系列之WHAT、WHY、HOW

    What? Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发. Why? Perl追求简洁快速地解决问题,可很方便 ...

  2. Flutter基础系列之入门(一)

    1.Flutter是什么? 官方介绍:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter ...

  3. java基础系列--SecurityManager入门(转)

    转载作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/yiwangzhibujian/p/6207212.html 一.文章的目的 这是一篇对Java安全管理器入门的文 ...

  4. Python3基础系列-基本入门语法

    本文简单地介绍了python的一些基本入门知识,通过对这些知识的了解,大家可以写一些简单的代码,同时也为后面深入理解打下基础.本文的主要内容如下: 值和类型 值,即value,通常有:1,2,3.14 ...

  5. javascript基础系列(入门前须知)

    -----------------------小历史---------------------------- javascript与java是两种语言,他们的创作公司不同,JavaScript当时是借 ...

  6. 大数据入门基础系列之Hadoop1.X、Hadoop2.X和Hadoop3.X的多维度区别详解(博主推荐)

    不多说,直接上干货! 在前面的博文里,我已经介绍了 大数据入门基础系列之Linux操作系统简介与选择 大数据入门基础系列之虚拟机的下载.安装详解 大数据入门基础系列之Linux的安装详解 大数据入门基 ...

  7. mybatis基础系列(一)——mybatis入门

    好久不发博客了,写博文的一个好处是能让心静下来,整理下之前学习过的一些知识一起分享,大神路过~ mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. ...

  8. 夯实Java基础系列5:Java文件和Java包结构

    目录 Java中的包概念 包的作用 package 的目录结构 设置 CLASSPATH 系统变量 常用jar包 java软件包的类型 dt.jar rt.jar *.java文件的奥秘 *.Java ...

  9. 夯实Java基础系列9:深入理解Class类和Object类

    目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...

随机推荐

  1. [TYVJ] P1023 奶牛的锻炼

    奶牛的锻炼 背景 Background USACO   描述 Description 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加 ...

  2. 养成代码注释习惯,帮助你更好使用NetBeans导航器

    在使用NetBeans编写php代码时,为了在一个类中,或者在方法库文件中快速找到你想要找的函数或方法,通常我们会使用NetBeans的导航器. 我们看一个导航器的事例: 大家知道,在php中代码习惯 ...

  3. LeetCode_Wildcard Matching

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...

  4. Buffer lock

    buffer lock    Oracle 提供非常精确,有效的Row Level Lock机制,多个用户同时修改数据时,为了保护数据. 以块为单位挂起锁的情况不会发生,但这不太正确. 以块为单位的锁 ...

  5. bst 二叉搜索树简单实现

    //数组实现二叉树: // 1.下标为零的元素为根节点,没有父节点 // 2.节点i的左儿子是2*i+1:右儿子2*i+2:父节点(i-1)/2: // 3.下标i为奇数则该节点有有兄弟,否则又左兄弟 ...

  6. Lowest Common Ancestor of a Binary Search Tree 解答

    Question Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes ...

  7. Java宝典(一)

    -switch语句能作用在byte上,能否作用在long上,能否作用在String上? -在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式可以是int基本类型或I ...

  8. Linux 块设备驱动 (一)

    1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...

  9. ZOJ Goldbach 2013年长沙赛区网络赛

    迟到了一天的AC.... 思路: 先把单个素数 或着 两个素数能组成的情况预处理一下,然后对于给出的 n,拿第三个素数去和两个素数的情况匹配,最后要注意去重. 详情见代码. 因为手残少敲了一个 els ...

  10. Swiper滑动Html5手机浏览器自适应

    手机网页能通过window.screen.height, width获取屏幕分辨率,于是能够通过分辨率比率来计算高度. window.onload=function(){ var swiper = d ...