Perl - 快速指南


Perl - 简介

Perl 是一种通用编程语言,最初是为文本操作而开发的,现在用于广泛的任务,包括系统管理、Web 开发、网络编程、GUI 开发等。

什么是 Perl?

  • Perl 是一种稳定的跨平台编程语言。

  • 尽管 Perl 并不是正式的缩写词,但很少有人将其用作实用提取和报告语言

  • 它用于公共和私营部门的关键任务项目。

  • Perl 是一款开源软件,根据其Artistic LicenseGNU 通用公共许可证 (GPL)获得许可。

  • Perl 是由拉里·沃尔 (Larry Wall) 创建的。

  • Perl 1.0 于 1987 年发布到 usenet 的 alt.comp.sources。

  • 在编写本教程时,perl 的最新版本是 5.16.2。

  • Perl 被收录在《牛津英语词典》中。

PC Magazine 宣布 Perl 入围 1998 年开发工具类别技术卓越奖的决赛。

Perl 特性

  • Perl 吸收了其他语言的最佳功能,例如 C、awk、sed、sh 和 BASIC 等。

  • Perls数据库集成接口DBI支持第三方数据库,包括Oracle、Sybase、Postgres、MySQL等。

  • Perl 可与 HTML、XML 和其他标记语言一起使用。

  • Perl 支持 Unicode。

  • Perl 符合 Y2K 标准。

  • Perl 支持过程编程和面向对象编程。

  • Perl 通过 XS 或 SWIG 与外部 C/C++ 库连接。

  • Perl 是可扩展的。综合 Perl 档案网络 ( CPAN )提供了 20,000 多个第三方模块。

  • Perl 解释器可以嵌入到其他系统中。

Perl 和网络

  • 由于其文本操作功能和快速的开发周期,Perl 曾经是最流行的 Web 编程语言。

  • Perl 被广泛称为“互联网的胶带”。

  • Perl 可以处理加密的 Web 数据,包括电子商务交易。

  • Perl 可以嵌入到 Web 服务器中,将处理速度提高 2000%。

  • Perl 的mod_perl允许 Apache Web 服务器嵌入 Perl 解释器。

  • Perl 的DBI包使 Web 数据库集成变得容易。

Perl 被解释

Perl 是一种解释性语言,这意味着您的代码可以按原样运行,无需创建不可移植的可执行程序的编译阶段。

传统的编译器将程序转换为机器语言。当您运行 Perl 程序时,它首先被编译为字节代码,然后(在程序运行时)转换为机器指令。所以它与 shell 或 Tcl 不太一样,后者是严格解释的,没有中间表示。

它也不像大多数版本的 C 或 C++,直接编译成机器相关的格式。它与Pythonawk和 Emacs .elc 文件一起介于两者之间。

Perl - 环境

在开始编写 Perl 程序之前,让我们了解如何设置 Perl 环境。Perl 可在多种平台上使用 -

  • Unix(Solaris、Linux、FreeBSD、AIX、HP/UX、SunOS、IRIX 等)
  • 赢得 9x/NT/2000/
  • 操作系统
  • Macintosh(PPC,68K)
  • Solaris(x86、SPARC)
  • 开放式虚拟管理系统
  • Alpha(7.2 及更高版本)
  • 塞班
  • Debian GNU/kFreeBSD
  • MirOS BSD
  • 还有很多...

这很可能是您的系统上安装了 perl。只需尝试在 $ 提示符下发出以下命令 -

$perl -v

如果您的计算机上安装了 perl,那么您将收到如下消息 -

This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

如果您尚未安装 perl,请继续下一部分。

获取 Perl 安装

最新的源代码、二进制文件、文档、新闻等都可以在 Perl 的官方网站上找到。

Perl 官方网站- https://www.perl.org/

您可以从以下站点下载 Perl 文档。

Perl 文档网站- https://perldoc.perl.org

安装 Perl

Perl 发行版可用于多种平台。您只需下载适用于您的平台的二进制代码并安装 Perl。

如果您的平台的二进制代码不可用,您需要 C 编译器来手动编译源代码。编译源代码在选择安装中所需的功能方面提供了更大的灵活性。

以下是在各种平台上安装 Perl 的快速概述。

Unix 和 Linux 安装

以下是在 Unix/Linux 机器上安装 Perl 的简单步骤。

  • 打开 Web 浏览器并访问https://www.perl.org/get.html。

  • 点击链接下载适用于 Unix/Linux 的压缩源代码。

  • 下载perl-5.xytar.gz文件并在 $ 提示符下发出以下命令。

$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y
$./Configure -de
$make
$make test
$make install

注意- 这里 $ 是 Unix 提示符,您可以在其中键入命令,因此请确保在键入上述命令时没有键入 $。

这会将 Perl 安装在标准位置/usr/local/bin中,其库安装在/usr/local/lib/perlXX中,其中 XX 是您正在使用的 Perl 版本。

发出make命令后,需要一段时间来编译源代码。安装完成后,您可以在 $ 提示符下发出perl -v命令来检查 perl 安装。如果一切正常,那么它将显示如上所示的消息。

Windows安装

以下是在 Windows 计算机上安装 Perl 的步骤。

  • 点击 Windows 上的 Strawberry Perl 安装链接http://strawberryperl.com

  • 下载 32 位或 64 位版本的安装。

  • 在 Windows 资源管理器中双击运行下载的文件。这会弹出 Perl 安装向导,非常容易使用。只需接受默认设置,等待安装完成,即可开始使用!

Macintosh 安装

为了构建您自己的 Perl 版本,您需要“make”,它是 Apple 开发工具的一部分,通常随 Mac OS 安装 DVD 提供。你不需要最新版本的 Xcode(现在是收费的)来安装 make。

以下是在 Mac OS X 计算机上安装 Perl 的简单步骤。

  • 打开 Web 浏览器并访问https://www.perl.org/get.html

  • 点击链接下载适用于 Mac OS X 的压缩源代码。

  • 下载perl-5.xytar.gz文件并在 $ 提示符下发出以下命令。

$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y
$./Configure -de
$make
$make test
$make install

这会将 Perl 安装在标准位置/usr/local/bin中,其库安装在/usr/local/lib/perlXX中,其中 XX 是您正在使用的 Perl 版本。

运行 Perl

以下是启动 Perl 的不同方法。

互动口译员

您可以输入perl并通过从命令行启动交互式解释器立即开始编码。您可以在 Unix、DOS 或任何其他为您提供命令行解释器或 shell 窗口的系统中执行此操作。

$perl  -e <perl code>           # Unix/Linux

or 

C:>perl -e <perl code>          # Windows/DOS

以下是所有可用命令行选项的列表 -

先生。 选项和说明
1

-d[:调试器]

在调试器下运行程序

2

-I目录

指定@INC/#include目录

3

-T

启用污染检查

4

-t

启用污染警告

5

-U

允许不安全操作

6

-w

启用许多有用的警告

7

-W

启用所有警告

8

-X

禁用所有警告

9

-e 程序

运行作为程序发送的 Perl 脚本

10

文件

从给定文件运行 Perl 脚本

来自命令行的脚本

Perl 脚本是一个文本文件,其中保存 Perl 代码,并且可以通过调用应用程序上的解释器在命令行中执行它,如下所示 -

$perl  script.pl          # Unix/Linux

or 

C:>perl script.pl         # Windows/DOS

集成开发环境

您也可以从图形用户界面 (GUI) 环境运行 Perl。您所需要的只是系统上有一个支持 Perl 的 GUI 应用程序。您可以下载Padre,Perl IDE。如果您熟悉 Eclipse,还可以使用 Eclipse 插件EPIC - Perl 编辑器和 IDE for Eclipse 。

在继续下一章之前,请确保您的环境已正确设置并且工作正常。如果您无法正确设置环境,则可以向系统管理员寻求帮助。

后续章节中给出的所有示例均在 CentOS 版本的 Linux 上使用 v5.16.2 版本执行。

Perl - 语法概述

Perl 借鉴了许多语言的语法和概念:awk、sed、C、Bourne Shell、Smalltalk、Lisp 甚至英语。然而,这些语言之间存在一些明显的差异。本章旨在让您快速掌握 Perl 中所需的语法。

Perl 程序由一系列声明和语句组成,这些声明和语句从上到下运行。循环、子例程和其他控制结构允许您在代码中跳转。每个简单语句都必须以分号 (;) 结尾。

Perl 是一种自由格式的语言:您可以按照自己喜欢的方式格式化和缩进它。空格主要用于分隔标记,这与 Python 等语言不同,空格是语法的重要组成部分,而 Fortran 则无关紧要。

第一个 Perl 程序

交互模式编程

您可以在命令行中使用带有-e选项的 Perl 解释器,它允许您从命令行执行 Perl 语句。让我们在 $ 提示符下尝试一些操作,如下所示 -

$perl -e 'print "Hello World\n"'

此执行将产生以下结果 -

Hello, world

脚本模式编程

假设您已经处于 $ 提示符下,让我们使用 vi 或 vim 编辑器打开一个文本文件 hello.pl 并将以下行放入文件中。

#!/usr/bin/perl

# This will print "Hello, World"
print "Hello, world\n";

这里/usr/bin/perl实际上是 perl 解释器二进制文件。在执行脚本之前,请务必更改脚本文件的模式并赋予执行权限,通常设置为 0755 效果很好,最后执行上述脚本如下 -

$chmod 0755 hello.pl
$./hello.pl

此执行将产生以下结果 -

Hello, world

您可以根据您的个人喜好对函数参数使用括号或省略它们。他们只是偶尔需要澄清优先级问题。以下两个语句产生相同的结果。

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

Perl 文件扩展名

Perl 脚本可以在任何普通的简单文本编辑器程序内创建。每种类型的平台都有多种可用的程序。有许多专为程序员设计的程序可以在网上下载。

作为 Perl 约定,Perl 文件必须以 .pl 或 .PL 文件扩展名保存,以便被识别为正常运行的 Perl 脚本。文件名可以包含数字、符号和字母,但不得包含空格。在空格处使用下划线 (_)。

Perl 中的注释

任何编程语言中的注释都是开发人员的朋友。注释可用于使程序用户友好,并且解释器可以简单地跳过它们,而不会影响代码功能。例如,在上面的程序中,以#开头的行是注释。

简单地说 Perl 中的注释以哈希符号开头并运行到行尾 -

# This is a comment in perl

以 = 开头的行被解释为嵌入文档 (pod) 部分的开始,编译器将忽略直到下一个 =cut 的所有后续行。以下是示例 -

#!/usr/bin/perl

# This is a single line comment
print "Hello, world\n";

=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These comments will be ignored by the 
compiler until the next =cut is encountered.
=cut

这将产生以下结果 -

Hello, world

Perl 中的空格

Perl 程序不关心空格。以下程序运行得很好 -

#!/usr/bin/perl

print       "Hello, world\n";

但是,如果空格位于带引号的字符串内,那么它们将按原样打印。例如 -

#!/usr/bin/perl

# This would print with a line break in the middle
print "Hello
          world\n";

这将产生以下结果 -

Hello
          world

所有类型的空白(如空格、制表符、换行符等)在引号之外使用时对于解释器来说都是等效的。仅包含空格(可能带有注释)的行称为空行,Perl 完全忽略它。

Perl 中的单引号和双引号

您可以在文字字符串周围使用双引号或单引号,如下所示 -

#!/usr/bin/perl

print "Hello, world\n";
print 'Hello, world\n';

这将产生以下结果 -

Hello, world
Hello, world\n$

单引号和双引号有一个重要的区别。仅双引号会插入变量和特殊字符(例如换行符 \n),而单引号不会插入任何变量或特殊字符。检查下面的示例,其中我们使用 $a 作为变量来存储值并稍后打印该值 -

#!/usr/bin/perl

$a = 10;
print "Value of a = $a\n";
print 'Value of a = $a\n';

这将产生以下结果 -

Value of a = 10
Value of a = $a\n$

“这里”文件

您可以轻松地存储或打印多行文本。甚至您也可以在“此处”文档中使用变量。下面是一个简单的语法,仔细检查 << 和标识符之间不能有空格。

标识符可以是一个简单的单词,也可以是一些引用的文本,就像我们下面使用的 EOF 一样。如果标识符被引用,则您使用的引用类型决定了此处文档内文本的处理方式,就像常规引用一样。不带引号的标识符的作用类似于双引号。

#!/usr/bin/perl

$a = 10;
$var = <<"EOF";
This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be 
interpolated. For example value of a = $a
EOF
print "$var\n";

$var = <<'EOF';
This is case of single quote so variable value will be 
interpolated. For example value of a = $a
EOF
print "$var\n";

这将产生以下结果 -

This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be
interpolated. For example value of a = 10

This is case of single quote so variable value will be
interpolated. For example value of a = $a

转义字符

Perl 使用反斜杠 (\) 字符来转义可能干扰代码的任何类型的字符。让我们举一个例子,我们想要打印双引号和 $ 符号 -

#!/usr/bin/perl

$result = "This is \"number\"";
print "$result\n";
print "\$result\n";

这将产生以下结果 -

This is "number"
$result

Perl 标识符

Perl 标识符是用于标识变量、函数、类、模块或其他对象的名称。Perl 变量名称以 $、@ 或 % 开头,后跟零个或多个字母、下划线和数字(0 到 9)。

Perl 不允许在标识符中使用标点符号,例如 @、$ 和 %。Perl 是一种区分大小写的编程语言。因此$Manpower$manpower在 Perl 中是两个不同的标识符。

Perl - 数据类型

Perl 是一种松散类型语言,在程序中使用时无需为数据指定类型。Perl 解释器将根据数据本身的上下文来选择类型。

Perl 具有三种基本数据类型:标量、标量数组和标量散列(也称为关联数组)。以下是有关这些数据类型的一些详细信息。

先生。 类型和描述
1

标量

标量是简单变量。它们前面有一个美元符号 ($)。标量可以是数字、字符串或引用。引用实际上是变量的地址,我们将在接下来的章节中看到。

2

数组

数组是标量的有序列表,您可以通过数字索引访问这些标量,该索引从 0 开始。它们前面有一个“at”符号 (@)。

3

哈希值

哈希是无序的键/值对集合,您可以使用键作为下标来访问它们。它们前面有一个百分号 (%)。

数字文字

Perl 在内部将所有数字存储为有符号整数或双精度浮点值。数字文字以以下任何浮点或整数格式指定 -

类型 价值
整数 1234
负整数 -100
浮点 2000年
科学计数法 16.12E14
十六进制 0xffff
八进制 第0577章

字符串文字

字符串是字符序列。它们通常是由单引号 (') 或双引号 (") 分隔的字母数字值。它们的工作方式与 UNIX shell 引号非常相似,您可以在其中使用单引号字符串和双引号字符串。

双引号字符串文字允许变量插值,而单引号字符串则不允许。有些字符以反斜杠开头,具有特殊含义,用于表示换行符 (\n) 或制表符 (\t)。

您可以直接在双引号字符串中嵌入换行符或任何以下转义序列 -

转义序列 意义
\\ 反斜杠
\' 单引号
\" 双引号
\A 警报或铃声
\b 退格键
\F 换页
\n 新队
\r 回车符
\t 水平制表符
\v 垂直标签
\0nn 创建八进制格式的数字
\xnn 创建十六进制格式的数字
\cX 控制字符,x可以是任意字符
\u 强制下一个字符为大写
\l 强制下一个字符为小写
\U 强制所有以下字符为大写
\L 强制所有以下字符为小写
\问 反斜杠后面的所有非字母数字字符
\E 结束 \U、\L 或 \Q

例子

让我们再次看看字符串在单引号和双引号中的表现。这里我们将使用上表中提到的字符串转义,并使用标量变量来分配字符串值。

#!/usr/bin/perl

# This is case of interpolation.
$str = "Welcome to \ntutorialspoint.com!";
print "$str\n";

# This is case of non-interpolation.
$str = 'Welcome to \ntutorialspoint.com!';
print "$str\n";

# Only W will become upper case.
$str = "\uwelcome to tutorialspoint.com!";
print "$str\n";

# Whole line will become capital.
$str = "\UWelcome to tutorialspoint.com!";
print "$str\n";

# A portion of line will become capital.
$str = "Welcome to \Ututorialspoint\E.com!"; 
print "$str\n";

# Backsalash non alpha-numeric including spaces.
$str = "\QWelcome to tutorialspoint's family";
print "$str\n";

这将产生以下结果 -

Welcome to
tutorialspoint.com!
Welcome to \ntutorialspoint.com!
Welcome to tutorialspoint.com!
WELCOME TO TUTORIALSPOINT.COM!
Welcome to TUTORIALSPOINT.com!
Welcome\ to\ tutorialspoint\'s\ family

Perl - 变量

变量是用于存储值的保留内存位置。这意味着当您创建变量时,您会在内存中保留一些空间。

根据变量的数据类型,解释器分配内存并决定可以在保留内存中存储什么。因此,通过为变量分配不同的数据类型,您可以在这些变量中存储整数、小数或字符串。

我们了解到 Perl 具有以下三种基本数据类型 -

  • 标量
  • 数组
  • 哈希值

因此,我们将在 Perl 中使用三种类型的变量。标量变量前面有一个美元符号 ($),它可以存储数字、字符串或引用。数组变量前面带有@符号,它将存储有序的标量列表最后,哈希变量前面会带有符号 %,并将用于存储键/值对集。

Perl 在单独的命名空间中维护每个变量类型。因此,您可以对标量变量、数组或哈希使用相同的名称,而不必担心冲突。这意味着 $foo 和 @foo 是两个不同的变量。

创建变量

Perl 变量不必显式声明来保留内存空间。当您为变量赋值时,声明会自动发生。等号 (=) 用于给变量赋值。

请注意,如果我们在程序中使用use strict语句,则在使用变量之前必须声明该变量。

= 运算符左侧的操作数是变量的名称,= 运算符右侧的操作数是存储在变量中的值。例如 -

$age = 25;             # An integer assignment
$name = "John Paul";   # A string 
$salary = 1445.50;     # A floating point

这里 25、“John Paul”和 1445.50 分别是分配给$age$name$salary变量的值。很快我们就会看到如何为数组和散列赋值。

标量变量

标量是单个数据单元。该数据可能是整数、浮点数、字符、字符串、段落或整个网页。简单地说,它可以是任何东西,但只能是单一的东西。

这是使用标量变量的简单示例 -

#!/usr/bin/perl

$age = 25;             # An integer assignment
$name = "John Paul";   # A string 
$salary = 1445.50;     # A floating point

print "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";

这将产生以下结果 -

Age = 25
Name = John Paul
Salary = 1445.5

数组变量

数组是存储标量值的有序列表的变量。数组变量前面有一个“at”(@) 符号。要引用数组的单个元素,您将使用美元符号 ($) 和变量名称,后跟方括号中的元素索引。

这是使用数组变量的简单示例 -

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

这里我们在 $ 符号之前使用转义符号 (\) 只是为了打印它。其他 Perl 会将其理解为变量并打印其值。执行时,将产生以下结果 -

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

哈希变量

哈希是一组键/值对。哈希变量前面有一个百分号 (%)。要引用哈希的单个元素,您将使用哈希变量名称,后跟与大括号中的值关联的“键”。

这是使用哈希变量的简单示例 -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";

这将产生以下结果 -

$data{'John Paul'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

可变上下文

Perl 根据上下文(即使用变量的情况)对同一变量进行不同的处理。让我们检查以下示例 -

#!/usr/bin/perl

@names = ('John Paul', 'Lisa', 'Kumar');

@copy = @names;
$size = @names;

print "Given names are : @copy\n";
print "Number of names are : $size\n";

这将产生以下结果 -

Given names are : John Paul Lisa Kumar
Number of names are : 3

这里@names是一个数组,它已在两个不同的上下文中使用。首先,我们将其复制到任何其他数组(即列表)中,因此假设上下文是列表上下文,它会返回所有元素。接下来,我们使用相同的数组并尝试将此数组存储在标量中,因此在本例中,假设上下文是标量上下文,它仅返回此数组中的元素数量。下表列出了各种上下文 -

先生。 上下文和描述
1

标量

对标量变量的赋值会计算标量上下文中的右侧。

2

列表

对数组或散列的赋值会计算列表上下文中的右侧。

3

布尔值

布尔上下文就是对表达式进行求值以确定它是真还是假的任何地方。

4

空白

这个上下文不仅不关心返回值是什么,它甚至不需要返回值。

5

插值法

这种上下文仅发生在引号内,或者像引号一样工作的东西。

Perl - 标量

标量是单个数据单元。该数据可能是整数、浮点数、字符、字符串、段落或整个网页。

这是使用标量变量的简单示例 -

#!/usr/bin/perl

$age = 25;             # An integer assignment
$name = "John Paul";   # A string 
$salary = 1445.50;     # A floating point

print "Age = $age\n";
print "Name = $name\n";
print "Salary = $salary\n";

这将产生以下结果 -

Age = 25
Name = John Paul
Salary = 1445.5

数值标量

标量通常是数字或字符串。以下示例演示了各种类型的数字标量的用法 -

#!/usr/bin/perl

$integer = 200;
$negative = -300;
$floating = 200.340;
$bigfloat = -1.2E-23;

# 377 octal, same as 255 decimal
$octal = 0377;

# FF hex, also 255 decimal
$hexa = 0xff;

print "integer = $integer\n";
print "negative = $negative\n";
print "floating = $floating\n";
print "bigfloat = $bigfloat\n";
print "octal = $octal\n";
print "hexa = $hexa\n";

这将产生以下结果 -

integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255

字符串标量

以下示例演示了各种类型的字符串标量的用法。请注意单引号字符串和双引号字符串之间的区别 -

#!/usr/bin/perl

$var = "This is string scalar!";
$quote = 'I m inside single quote - $var';
$double = "This is inside single quote - $var";

$escape = "This example of escape -\tHello, World!";

print "var = $var\n";
print "quote = $quote\n";
print "double = $double\n";
print "escape = $escape\n";

这将产生以下结果 -

var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape -       Hello, World

标量运算

您将在单独的章节中看到 Perl 中可用的各种运算符的详细信息,但在这里我们将列出一些数字和字符串操作。

#!/usr/bin/perl

$str = "hello" . "world";       # Concatenates strings.
$num = 5 + 10;                  # adds two numbers.
$mul = 4 * 5;                   # multiplies two numbers.
$mix = $str . $num;             # concatenates string and number.

print "str = $str\n";
print "num = $num\n";
print "mix = $mix\n";

这将产生以下结果 -

str = helloworld
num = 15
mul = 20
mix = helloworld15

多行字符串

如果您想在程序中引入多行字符串,您可以使用标准单引号,如下所示 -

#!/usr/bin/perl

$string = 'This is
a multiline
string';

print "$string\n";

这将产生以下结果 -

This is
a multiline
string

您也可以使用“此处”文档语法来存储或打印多行,如下所示 -

#!/usr/bin/perl

print <<EOF;
This is
a multiline
string
EOF

这也会产生相同的结果 -

This is
a multiline
string

V 型弦

v1.20.300.4000 形式的文字被解析为由具有指定序数的字符组成的字符串。这种形式称为 V 型弦。

v 字符串提供了另一种更易读的方式来构造字符串,而不是使用可读性稍差的插值形式“\x{1}\x{14}\x{12c}\x{fa0}”。

它们是以 av 开头并后跟一个或多个点分隔元素的任何文字。例如 -

#!/usr/bin/perl

$smile  = v9786;
$foo    = v102.111.111;
$martin = v77.97.114.116.105.110; 

print "smile = $smile\n";
print "foo = $foo\n";
print "martin = $martin\n";

这也会产生相同的结果 -

smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.

特殊文字

到目前为止,您一定对字符串标量及其连接和插值操作有了一定的了解。那么让我告诉您三个特殊文字 __FILE__、__LINE__ 和 __PACKAGE__ 代表程序中该点的当前文件名、行号和包名称。

它们只能用作单独的标记,不会插入到字符串中。检查下面的例子 -

#!/usr/bin/perl

print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";

# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";

这将产生以下结果 -

File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__

Perl - 数组

数组是存储标量值的有序列表的变量。数组变量前面有一个“at”(@) 符号。要引用数组的单个元素,您将使用美元符号 ($) 和变量名称,后跟方括号中的元素索引。

这是使用数组变量的简单示例 -

#!/usr/bin/perl

@ages = (25, 30, 40);             
@names = ("John Paul", "Lisa", "Kumar");

print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";

这里我们在 $ 符号之前使用转义符号 (\) 只是为了打印它。其他 Perl 会将其理解为变量并打印其值。执行时,将产生以下结果 -

$ages[0] = 25
$ages[1] = 30
$ages[2] = 40
$names[0] = John Paul
$names[1] = Lisa
$names[2] = Kumar

在 Perl 中,列表和数组术语经常被使用,就好像它们可以互换一样。但列表是数据,数组是变量。

数组创建

数组变量以 @ 符号为前缀,并使用括号或 qw 运算符进行填充。例如 -

@array = (1, 2, 'Hello');
@array = qw/This is an array/;

第二行使用 qw// 运算符,它返回字符串列表,并用空格分隔分隔字符串。在此示例中,这将生成一个四元素数组;第一个元素是“this”,最后一个(第四个)元素是“array”。这意味着您可以使用不同的行,如下所示 -

@days = qw/Monday
Tuesday
...
Sunday/;

您还可以通过单独分配每个值来填充数组,如下所示 -

$array[0] = 'Monday';
...
$array[6] = 'Sunday';

访问数组元素

访问数组中的各个元素时,必须在变量前添加美元符号 ($) 前缀,然后将元素索引附加在变量名称后面的方括号内。例如 -

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

print "$days[0]\n";
print "$days[1]\n";
print "$days[2]\n";
print "$days[6]\n";
print "$days[-1]\n";
print "$days[-7]\n";

这将产生以下结果 -

Mon
Tue
Wed
Sun
Sun
Mon

数组索引从零开始,因此要访问第一个元素,您需要将 0 作为索引。您还可以给出负索引,在这种情况下,您可以从数组的末尾而不是开头选择元素。这意味着以下内容 -

print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon

序号数组

Perl 提供了连续数字和字母的快捷方式。例如,当数到 100 时,我们可以执行如下操作,而不是输入每个元素:

#!/usr/bin/perl

@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);

print "@var_10\n";   # Prints number from 1 to 10
print "@var_20\n";   # Prints number from 10 to 20
print "@var_abc\n";  # Prints number from a to z

这里双点(..)称为范围运算符。这将产生以下结果 -

1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z

数组大小

数组的大小可以使用数组上的标量上下文来确定 - 返回的值将是数组中元素的数量 -

@array = (1,2,3);
print "Size: ",scalar @array,"\n";

返回的值始终是数组的物理大小,而不是有效元素的数量。您可以使用此片段来演示这一点,以及标量 @array 和 $#array 之间的区别,如下所示 -

#!/usr/bin/perl

@array = (1,2,3);
$array[50] = 4;

$size = @array;
$max_index = $#array;

print "Size:  $size\n";
print "Max Index: $max_index\n";

这将产生以下结果 -

Size: 51
Max Index: 50

数组中只有 4 个元素包含信息,但数组长度为 51 个元素,最高索引为 50。

添加和删​​除数组中的元素

Perl 提供了许多有用的函数来添加和删除数组中的元素。您可能有一个疑问,什么是函数?到目前为止,您已经使用print函数来打印各种值。类似地,还有各种其他功能或有时称为子例程,它们可用于各种其他功能。

先生。 类型和描述
1

推送@ARRAY,列表

将列表的值推到数组的末尾。

2

流行@ARRAY

弹出并返回数组的最后一个值。

3

移位@ARRAY

将数组的第一个值移开并返回它,将数组缩短 1 并将所有内容向下移动。

4

取消移动@ARRAY,列表

将 list 添加到数组的前面,并返回新数组中的元素数。

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins  = @coins\n";

# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins  = @coins\n";

# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins  = @coins\n";

# remove one element from the last of the array.
pop(@coins);
print "4. \@coins  = @coins\n";

# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins  = @coins\n";

这将产生以下结果 -

1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel

切片数组元素

您还可以从数组中提取“切片” - 也就是说,您可以从数组中选择多个项目以生成另一个数组。

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3,4,5];

print "@weekdays\n";

这将产生以下结果 -

Thu Fri Sat

切片的规范必须有一个有效索引列表,可以是正数,也可以是负数,每个索引都用逗号分隔。为了提高速度,您还可以使用..范围运算符 -

#!/usr/bin/perl

@days = qw/Mon Tue Wed Thu Fri Sat Sun/;

@weekdays = @days[3..5];

print "@weekdays\n";

这将产生以下结果 -

Thu Fri Sat

替换数组元素

现在我们将介绍另一个名为splice()的函数,它具有以下语法 -

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

此函数将删除由 OFFSET 和 LENGTH 指定的 @ARRAY 元素,并用 LIST 替换它们(如果指定)。最后,它返回从数组中删除的元素。以下是示例 -

#!/usr/bin/perl

@nums = (1..20);
print "Before - @nums\n";

splice(@nums, 5, 5, 21..25); 
print "After - @nums\n";

这将产生以下结果 -

Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20

这里,实际的替换从第 6 个数字开始,然后将 6 到 10 的 5 个元素替换为数字 21、22、23、24 和 25。

将字符串转换为数组

让我们看一下另一个名为split()的函数,它具有以下语法 -

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

该函数将字符串拆分为字符串数组并返回它。如果指定 LIMIT,则最多拆分为该数量的字段。如果省略 PATTERN,则按空格分割。以下是示例 -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

print "$string[3]\n";  # This will print Roses
print "$names[4]\n";   # This will print Michael

这将产生以下结果 -

Roses
Michael

将数组转换为字符串

我们可以使用join()函数重新连接数组元素并形成一个长标量字符串。该函数具有以下语法 -

join EXPR, LIST

该函数将 LIST 的各个字符串连接成一个字符串,其中字段由 EXPR 的值分隔,并返回该字符串。以下是示例 -

#!/usr/bin/perl

# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens";
$var_names = "Larry,David,Roger,Ken,Michael,Tom";

# transform above strings into arrays.
@string = split('-', $var_string);
@names  = split(',', $var_names);

$string1 = join( '-', @string );
$string2 = join( ',', @names );

print "$string1\n";
print "$string2\n";

这将产生以下结果 -

Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom

数组排序

sort ()函数根据 ASCII 数字标准对数组的每个元素进行排序。该函数具有以下语法 -

sort [ SUBROUTINE ] LIST

该函数对 LIST 进行排序并返回排序后的数组值。如果指定了 SUBROUTINE,则在对元素进行排序时将应用 SUBTROUTINE 内的指定逻辑。

#!/usr/bin/perl

# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";

# sort this array
@foods = sort(@foods);
print "After: @foods\n";

这将产生以下结果 -

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

请注意,排序是根据单词的 ASCII 数字值进行的。所以最好的选择是首先将数组的每个元素转换为小写字母,然后执行排序功能。

合并数组

因为数组只是一个以逗号分隔的值序列,所以您可以将它们组合在一起,如下所示 -

#!/usr/bin/perl

@numbers = (1,3,(4,5,6));

print "numbers = @numbers\n";

这将产生以下结果 -

numbers = 1 3 4 5 6

嵌入式数组只是成为主数组的一部分,如下所示 -

#!/usr/bin/perl

@odd = (1,3,5);
@even = (2, 4, 6);

@numbers = (@odd, @even);

print "numbers = @numbers\n";

这将产生以下结果 -

numbers = 1 3 5 2 4 6

从列表中选择元素

列表表示法与数组的表示法相同。您可以通过将方括号附加到列表并给出一个或多个索引来从数组中提取元素 -

#!/usr/bin/perl

$var = (5,4,3,2,1)[4];

print "value of var = $var\n"

这将产生以下结果 -

value of var = 1

同样,我们可以提取切片,尽管不需要前导@字符 -

#!/usr/bin/perl

@list = (5,4,3,2,1)[1..3];

print "Value of list = @list\n";

这将产生以下结果 -

Value of list = 4 3 2

Perl - 哈希

哈希是一组键/值对。哈希变量前面有一个百分号 (%)。要引用散列的单个元素,您将使用散列变量名称,前面带有“$”符号,后跟与大括号中的值关联的“key”。

这是使用哈希变量的简单示例 -

#!/usr/bin/perl

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'John Paul'} = $data{'John Paul'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";

这将产生以下结果 -

$data{'John Paul'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

创建哈希

哈希值是通过以下两种方式之一创建的。在第一种方法中,您将一个值一对一地分配给命名键 -

$data{'John Paul'} = 45;
$data{'Lisa'} = 30;
$data{'Kumar'} = 40;

在第二种情况下,您使用一个列表,该列表通过从列表中获取各个对进行转换:该对的第一个元素用作键,第二个元素用作值。例如 -

%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);

为了清楚起见,您可以使用 => 作为 的别名,以指示键/值对,如下所示 -

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

这是上述形式的另一种变体,看一下,这里所有的键前面都有连字符 (-),并且不需要在它们周围加上引号 -

%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

但重要的是要注意,有一个单词,即,没有空格键已用于这种形式的哈希形成,如果您以这种方式构建哈希,则将仅使用连字符来访问键,如下所示。

$val = %data{-JohnPaul}
$val = %data{-Lisa}

访问哈希元素

从散列访问各个元素时,必须在变量前添加美元符号 ($),然后将元素键附加在变量名称后面的大括号内。例如 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

print "$data{'John Paul'}\n";
print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";

这将产生以下结果 -

45
30
40

提取切片

您可以提取哈希的切片,就像从数组中提取切片一样。您将需要使用 @ 前缀作为变量来存储返回的值,因为它们将是值列表 -

#!/uer/bin/perl


%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

@array = @data{-JohnPaul, -Lisa};

print "Array : @array\n";

这将产生以下结果 -

Array : 45 30

提取键和值

您可以使用keys函数从哈希中获取所有键的列表,该函数具有以下语法 -

keys %HASH

该函数返回指定哈希的所有键的数组。以下是示例 -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@names = keys %data;

print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";

这将产生以下结果 -

Lisa
John Paul
Kumar

同样,您可以使用values函数来获取所有值的列表。该函数具有以下语法 -

values %HASH

该函数返回一个由指定哈希的所有值组成的普通数组。以下是示例 -

#!/usr/bin/perl 

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@ages = values %data;

print "$ages[0]\n";
print "$ages[1]\n";
print "$ages[2]\n";

这将产生以下结果 -

30
45
40

检查是否存在

如果您尝试从不存在的哈希访问键/值对,您通常会得到未定义的值,如果您打开了警告,那么您将收到运行时生成的警告。您可以通过使用exists函数来解决这个问题,如果指定的键存在,则该函数返回true,无论其值是什么 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

if( exists($data{'Lisa'} ) ) {
   print "Lisa is $data{'Lisa'} years old\n";
} else {
   print "I don't know age of Lisa\n";
}

这里我们介绍了 IF...ELSE 语句,我们将在单独的章节中研究它。现在,您假设if(condition)部分仅在给定条件为 true 时才会执行,否则会执行else部分。因此,当我们执行上面的程序时,它会产生以下结果,因为这里给定的条件存在($data{'Lisa'}返回 true -

Lisa is 30 years old

获取哈希大小

您可以通过使用键或值上的标量上下文来获取大小,即哈希中的元素数量。简而言之,首先您必须获取键或值的数组,然后您可以获得数组的大小,如下所示 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

@values = values %data;
$size = @values;
print "2 - Hash size:  is $size\n";

这将产生以下结果 -

1 - Hash size: is 3
2 - Hash size: is 3

添加和删​​除哈希中的元素

添加新的键/值对可以使用简单的赋值运算符通过一行代码来完成。但是要从哈希中删除元素,您需要使用删除函数,如下例所示 -

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size:  is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size:  is $size\n";

# delete the same element from t