Perl 教程:变量、数组、哈希及编程示例

什么是 Perl?

Perl的 是一种高级、通用、解释型、动态编程语言。Perl 是“实用提取和报告语言”的缩写,尽管 Perl 没有缩写。它由 Larry Wall 于 1987 年推出。Perl 语言专为文本编辑而设计。但现在,它被广泛用于各种用途,包括 Linux 系统管理、网络编程、Web 开发等。

编程语言概述

让我们简单地说一下。虽然计算机只理解 0 和 1(二进制语言/机器语言/[低级语言]),但对于我们人类来说,用二进制语言编程非常困难。Perl 是一种使用自然语言元素(常见英语中使用的单词)的编程语言,因此更容易被人类理解[高级语言现在有一个问题:计算机无法理解高级语言,而我们人类可以轻松理解高级语言。为此,我们需要某种可以将高级语言翻译成低级语言的东西。这时解释器就派上用场了。解释器是一种软件,它将用高级语言编写的程序转换为低级语言,以便计算机理解和执行程序中编写的指令。因此,Perl 是一个 解释型编程语言.

Perl 在哪里使用?

Perl 脚本语言的强大功能可以应用于许多领域。Perl 最流行的用途是 Web 开发。Perl 还用于自动执行 Web 服务器中的许多任务和其他管理工作,它可以自动生成电子邮件和清理系统。Perl 仍用于其原始目的,即提取数据和生成报告。它可以生成资源使用情况报告并检查网络中的安全问题。由于这个原因,Perl 已成为 Web 开发、网络和生物信息学中流行的语言。除此之外,perl 还可以用于 CGI 编程。

Perl 还可用于图像创建和处理。除了通过 telnet、FTP 等进行联网之外,图形用户界面创建、VLSI 电子产品和创建邮件过滤器以减少垃圾邮件行为也是 Perl 的一些用例。

Perl 还以 OOP(面向对象编程)实践的实现而闻名,并支持所有形式的继承(简单、多重和菱形)、多态性和封装。Perl 足够灵活,可以同时支持过程和 OOP 实践。Perl 还具有额外的模块,允许您编写或使用/重用用 Python、PHP、PDL、TCL、Octave、 Java, C, C++、Basic、Ruby 和 Lua。这意味着您可以将 Perl 与这些额外的 编程语言 而是重写现有的代码。

Perl编程语言的应用

Perl编程语言的应用

为什么使用 Perl?

确实,还有其他编程语言可以用来完成上述所有操作,那么为什么要专门使用 Perl 呢? Perl 非常容易学习,特别是如果你有计算机编程背景的话。Perl 的设计初衷是让人类更容易编写和理解,而不是让计算机更容易处理。它使用正则表达式。它的自然语言风格不同于使用特定语法和句法的其他编程语言;因此,Perl 非常灵活,不会强加给你任何特定的解决方案或问题思考方式。 Perl 的可移植性极强。 它可以在任何安装了 Perl 解释器的操作系统上运行,因此它与平台无关。所有 Linux Operating Systems 已安装 Perl,因此您可以立即在 Linux 中开始编写 Perl。这与 Shell 脚本不同,Shell 脚本的代码会随着所使用的 Linux 发行版的不同而变化,这使得其可移植性越来越差 Perl 中的小型特定任务变得非常容易和快速在本 Perl 初学者教程中,您将学习如何编写小型、快速的程序来完成特定任务。让我们以经典的 Hello World 程序为例,该程序可用于开始学习任何以 UNIX 为根源的编程语言:

例如:Perl hello world

Perl 的简单示例

#!/usr/bin/perl
print "Hello, world!";

输出:

您好,世界!

上面两行代码会打印出Hello, world!现在是不是太简单快捷了?有C语言知识的同学, C++ 会知道在这些语言中需要更多的代码行才能获得相同的输出。

您可能想知道为什么 Perl 在网络上非常出名。这很简单,因为网络上发生的大多数事情都是文本,而 Perl 非常擅长文本处理。如果我们将 Perl 与任何一种语言进行比较,那么 Perl 将是最好的语言,它擅长文件处理、文本处理和输出报告

Perl 最大的优点之一是 免费使用

Perl 社区坚信软件应免费提供、自由修改和自由分发。Perl 社区的几位志愿者致力于让编程语言尽可能好。

Perl 的优点和缺点

优点: 缺点:

Perl 的优点

Perl 的缺点

  • 与其他编程语言相比,Perl 在文本处理和解析方面最强大
  • 这是一种解释型语言,执行时间很快,因为不需要编译 Perl 脚本
  • 简单且易于编程和理解。
  • 它是面向对象的。
  • CPAN 库简化了 Perl 开发(我们将在后面的主题中详细了解这一点)。
  • 主要用于支付网关的 Web 开发。
  • 用于自动化并测试大多数网络和存储相关的东西。
  • 与其他编程语言相比,GUI 支持最少。
  • 您需要参考不太容易理解的复杂库模块(一旦您知道如何做事情,不要害怕一切都会变得容易)。
  • 理解复杂的模式需要经验。

让我们开始吧

了解了足够的 Perl 历史和用 Perl 编码所需的计算机编程基本概念后,我们就可以开始学习 Perl 了。下一章将教您如何在系统上设置 Perl,并为用 Perl 编码做好准备。本 Perl 脚本教程将以 Linux 为操作系统,学生将使用该操作系统用 Perl 进行编码。

下载并安装 Perl – Windows、Mac 和 Linux

如何获取 Perl?

好消息 你可能已经拥有它了!

但是如果您在系统上找不到它,您仍然可以免费获得它。

要了解您是否已安装 Perl,请进入命令行并输入:perl -v

如何下载 Perl

如果已安装 Perl,该命令将显示其版本。在本例中,版本为 v5.14.2。但如果没有……不要惊慌……

Unix的PERL 初学者教程 - 完整指南 已安装 虽然预装了 Perl,但您可能需要更新到最新版本。
Mac OS PERL 初学者教程 - 完整指南 已安装 OSX 预装了 Perl,但你可能需要将其更新到最新版本
WindowsPERL 初学者教程 - 完整指南 需要安装 有两种选择

  1. Strawberry Perl 是 Perl 的一个开源二进制发行版,适用于 Windows 操作系统。它包括一个编译器和预安装的模块,可以直接从 CPAN 安装 XS CPAN 模块
  2. ActiveState perl 提供 Perl 的二进制发行版(适用于许多平台),以及他们自己的 Perl 包管理器 (PPM)

在 Linux 上更新 Perl:

如果需要更新 Perl 版本,只需输入一行命令

sudo apt-get 安装 perl

然后放松。剩下的事都会有人处理的。只需确保您有可用的互联网连接即可。

在 Linux 上更新 PERL

在 Linux 上更新 PERL

安装 perl Windows:

首先,从此处下载 Active Perl 链接按照以下步骤安装 ActivePerl Windows 系统。请参见下面的屏幕截图。

步骤1: 下载安装程序并开始安装后,您将看到以下窗口,单击下一步继续。

如何在 Windows

步骤2: 接受许可协议以继续安装。

如何在 Windows

步骤3: 以下是将要安装的不同软件包。默认情况下,将选择所有软件包。唯一不同的是 PPM(Perl 软件包管理器)。这是 Active Perl 提供的实用程序,用于在系统中安装外部 Perl 模块或库。单击下一步继续。

安装 Perl Windows

步骤4: 这些是可用于 Perl 的不同类型的 Perl 扩展。我们主要将使用 .Pl、.Plx 和 .Pm 作为 Perl。Perl 模块基本上使用 .Pm 作为其文件扩展名来引用库文件。选择所有选项并单击下一步按钮。

安装 Perl Windows

步骤5: 单击“安装”按钮继续安装。

安装 Perl Windows

步骤6: 安装后,执行命令“Perl –v”检查Perl是否已成功安装在您的系统中。

PERL 安装 Windows

在 Linux 和 Linux 中设置 Perl 环境有很多事情需要讨论。 Windows,因为此安装不会包含很多库文件。您需要手动安装这些库文件。您可以使用 CPAN(Comprehensive Perl Archive 网络)或仅适用于 perl windows 的 PPM。但这些文件不是开始使用 Perl 编码所必需的。

除了这个 Windows 设置之外,您还可以使用 Windows 10 的 Linux 子系统在 Windows 上的新功能及其用于运行 perl 代码

第一个 Perl 程序

Hello world!

Perl 示例:Hello World

#!/usr/bin/perl -w
#this is just a comment…
print "Hello World";

如果你看不懂这段文字,不要担心。很快一切都会清楚。来吧,逐行看一下:

#!/usr/bin/perl		

这告诉 Opera系统使用位于 /usr/bin/perl 的程序执行此文件。有些 IDE 不需要此行。如果有必要,您必须在此处写入解释器的路径。切记!此特殊行必须位于程序的开头,并且必须从 #! use warnings; 开始。这是另一个特殊命令,它告诉解释器显示任何警告,即 -w,它会全局激活警告。

print "Hello World";		

打印指令将文本写入屏幕。行末的分号告诉 perl 解释器该指令已完成。在 Perl 代码中,必须在每条指令末尾添加分号。请注意引号(“)。对于打印指令,它是必需的。将上述脚本保存为 firstprog.pl

On Windows

如果您已安装 Strawberry,则只需单击“运行”即可。您也可以运行命令行界面并在控制台上写入:

C:\> perl path\firstprog.pl		

或者,如果 perl.exe 不在您的路径中:

C:\> c:\perl\bin\perl.exe firstprog.pl		

在Linux / Unix上

您只需打开终端并写入:

perl firstprog.pl		

如果无法运行该程序,请确保您有资格运行它。在终端中输入:

chmod +x firstprog.pl		

您的程序现在已可执行并准备运行。要执行,请输入:

./firstprog		

安装 cpan 减模块

模块是一组代码,用于执行在多个程序中执行常见操作的任务。如果您使用 perl 模块,则不必重写代码来执行相同的操作。Perl 可以使用此类外部代码库。最好的库之一是 CPAN。它代表综合 Perl Archive 网络包含大量 Perl 模块供您使用。它是一个由大量贡献此类模块的开发人员组成的社区或网络。通过在 perl 模块中安装对 CPAN 模块的支持,您可以使用 CPAN 模块并使您的工作更轻松。大多数 Perl 模块都是用 Perl 编写的,有些使用 XS(它们是用 C 编写的),因此需要 C 编译器(很容易获得此设置 - 不要惊慌。模块可能依赖于其他模块(几乎总是在 CPAN 上),如果没有它们(或没有它们的特定版本),就无法安装。值得仔细阅读以下选项的文档。CPAN 上的许多模块现在都需要最新版本的 Perl(版本 5.8 或更高版本)。安装 cpanminus 一个脚本来从 CPAN 获取、解压、构建和安装模块,以便更轻松地安装其他模块(您稍后会感谢我们)。安装 App-cpanminus perl 模块,在命令行中输入:

cpan App::cpanminus

cpan App::cpanminus 确保在下载和安装 perl 模块时具有互联网连接。

安装 cpan 减模块

现在安装任意模块:

cpan –i <Module_Name>.		

让我们看一个安装模块 File::Data(它是访问文件数据的接口)的例子。

安装 cpan 减模块

Perl 变量

现在,我们来谈谈变量。你可以把变量想象成一种容器,里面装着一个或多个值。一旦定义,变量的名称就保持不变,但值却会不断变化。

变量有 3 种类型:

Perl 中的变量类型

Perl 中的变量类型

最简单的是标量,这就是我们今天的主题

标量变量

这种类型的变量保存单一值。

它的名称以美元符号和 Perl 标识符(这是我们变量的名称)开头。

Perl 中的标量变量

Perl 中的标量变量

命名约定

如果你熟悉其他编程语言,那么你就会知道命名变量有一定的规则。同样,Perl 也有三个命名标量的规则。

  1. 所有标量名称都以 $ 开头。记住在每个名称前加上 $ 前缀很容易。将其视为 $scalar。
  2. 和 PHP 一样,第一个字符 $(Perl 中的特殊字符)后面允许使用字母数字字符,即 a 到 z、A 到 Z 和 0 到 9。下划线字符也是允许的。使用下划线将变量名拆分为两个单词。但第一个字符不能是数字。
  3. 尽管数字可以成为名称的一部分,但它们不能紧跟在 $ 后面。这意味着 $ 后面的第一个字符将是字母或下划线。来自 C/C++ 背景应该能够立即识别出相似性。示例

Perl 示例:

$var;
$Var32;
$vaRRR43;
$name_underscore_23;

然而,这些不是合法的标量变量名。

mohohoh                                              # $ character is missing 
$                                                    # must be at least one letter 
$47x                                           # second character must be a letter
$variable!                                 # you can't have a ! in a variable name

一般规则是,当 Perl 只有一个东西时,那就是标量。标量可以从设备读取,我们可以将其用于我们的程序。

两种标量数据类型

  1. Numbers
  2. 琴弦

Numbers:

在这种类型的标量数据中,我们可以指定:

  • 整数,简单地说就是整数,例如 2、0、534
  • 浮点数,是实数,例如 3.14、6.74、0.333

Perl 中的数字变量

注意:一般来说,Perl 解释器将整数视为浮点数。例如,如果你在程序中写入 2,Perl 会将其视为 2.0000

整数文字:

它由一个或多个数字组成,前面可以带有加号或减号,并且包含下划线。

Perl 示例:

0;
-2542;
4865415484645          #this also can be written with underscores (for clarity) : 4_865_415_484_645

如您所见,这没什么特别的。但相信我,这是最常见的标量类型。它们无处不在。

浮点文字:

它由数字、可选的减号、小数点和指数组成。

Perl 示例:

3.14;
255.000;
3.6e20;                                  # it's 3.6 times 10 to the 20th
-3.6e20;                                 # same as above, but negative
-3.6e-20;                                #it's negative 3.6 times 10 to the -20th
-3.6E-20;                                #we also can use E – this means the same the lowercase version -3.6e-20

Perl 中的浮点文字

八进制、十六进制和二进制表示法:

它是十进制的替代品。请允许我向您展示八进制、十六进制和二进制表示法。一个简短的表格列出了有关这种奇怪样式的所有重要信息:

代表性 基值 继续
八进制 8 0(零)
十六进制 16 0x
二进制 2 0b

Perl 示例:

255;                               # 255 in decimal notation
0377;                                   # 255 in octal notation
0xff;                                   # 255 in hexadecimal notation
0b11111111;                             # 255 in binary notation

对于 Perl 来说,所有这些值都意味着相同的意思。Perl 不会以相同的格式存储这些值。它会在内部将这些十六进制、二进制、八进制转换为十进制值。

赋值是标量最常见的操作,而且非常简单。Perl 使用等号。它从右侧获取表达式的值并将该值放入我们的变量中。

让我们看一些例子:

$size=15;             # give $size value of 15
$y = -7.78;           # give $y value of -7.78

此外,变量中不仅可以输入数字,还可以输入表达式。

$z = 6 + 12               # give $z value of 18

琴弦

字符串:它也是一种非常简单的标量类型。

Perl 中字符串的最大长度取决于计算机的内存量。字符串的大小没有限制,任何数量的字符、符号或单词都可以组成字符串。最短的字符串没有字符。最长的字符串可以填满整个系统内存。Perl 程序可以完全用 7 位 ASCII 字符集编写。Perl 还允许您在字符串文字中添加任何 8 位或 16 位字符集(又称非 ASCII 字符)。Perl 还增加了对 Unicode UTF-8 的支持。

Perl 中的字符串类型

与数字类似,字符串有两种不同的类型:

  • 单引号字符串文字
  • Double 引号字符串文字

单引号字符串文字

单引号用于括起您想要按字面意思理解的数据。举一个简短的例子,一切都应该很清楚:

Perl 示例:

#!/usr/bin/perl 
$num = 7;
$txt = 'it is $num';
print $txt;

输出:

它是$num

这里由于单引号的原因,$num 的值未被占用,而文字字符 '$'、'n'、'u' 和 'm' 被添加到 $txt 的值中

Double-quoted 字符串文字

Double 引号用于括起需要在处理前插入的数据。这意味着转义字符和变量不会简单地插入到后续操作中,而是会当场进行评估。转义字符可用于插入换行符、制表符等。

Perl 示例:

$num = 7; 
$txt = "it is $num"; 
print $txt;

输出:

它是 7

这里由于双引号,$num 的值被添加到 $txt 的值中

Double-quotes 插入标量和数组变量,但不能插入哈希值。另一方面,您可以使用双引号插入数组和哈希值的切片。

神秘\n

考虑以下程序

Perl 示例:

print "hello \n";

输出:

hello

Perl 不仅显示“hello\n”,还只显示“hello”。为什么?因为“\n”是一个特殊符号,表示在程序中显示文本时要转到新行。 print “hello\n new line”; 下一个问题 - 还有其他特殊符号吗? 是的,有!但别担心 - 只有几个。查看下表

建设 描述
\n 新队
\r 回报
\t 标签
\f 换页
\b 退格
\a
\e 逃生
\ 007 任何八进制 ASCII 值(此处 007 = 铃声)
\x7f 任何十六进制值(此处 7f = 删除)
\\ 反斜线
双引号
\l 下一个字母小写
\L 将后面所有字母小写,直到 \E
\u 下一个字母大写
\U 大写所有后续字母,直到 \E
\E 终止 \L, \U

我知道,没有“只有几个”……但相信我,你必须知道

字符串变量

这是我们在数字赋值中看到的相同操作。Perl 从等号右侧获取字符串,并将该字符串放入变量中。

Perl 示例:

$string = 'tutorial';                                      # give $string the eight-character string 'tutorial'
print $string;
$string = $size + 3 ;                                           # give $string the current value of $size plus 3
print $string;
$string = $ string * 5;                                         # multiplied $string by 5
print $string;

输出:

教程315

如您所见,您可以将数字和字符串放在同一个变量中。没有变量类。

字符串连接(句点):

连接运算符“.”用于连接两个或多个字符串。记住!如果字符串包含引号、回车符、反斜杠,则所有这些特殊字符都需要用反斜杠进行转义。

Perl' '变量示例:

#!/usr/bin/perl
$a = "Tom is";
$b = "favorite cat";
$c = $a ." mother's ". $b;
print $c;

输出:

汤姆是妈妈最喜欢的猫

字符串

“$a”,“$b” 使用“.”运算符连接并存储在“$c”中。

到底…

之间的转换 Numbers 和字符串:

如您所知,Perl 会根据需要自动将数字转换为字符串。Perl 如何知道我们现在需要什么?这很简单 - 一切都取决于运算符(我们稍后会讨论运算符,现在,只需接受有很多运算符,对于数字和字符串是不同的)如果运算符期望数字,Perl 将使用该值作为数字。如果运算符期望字符串,Perl 将使用该值作为字符串。换句话说 - 您无需担心这种转换。简短的例子,一切都应该很清楚:

Perl 示例:

$string = "43";
$number = 28;
$result = $string + $number;
print $result;

输出:

71

$string 的值被转换为整数并添加到 $number 的值中。

加法的结果 71 被赋值给 $result。

变量的作用域——访问修饰符

我们可以在程序的任何地方声明标量。但你需要指定访问修饰符

有 3 种类型的修饰符

  1. my
  2. 本地
  3. 我们的

我的:使用这个,您可以声明块内特定的任何变量。即在花括号内。

#!/usr/bin/perl 
my $var=5;
if(1)
{ 
my $var_2 =$var;
}
print $var_2;

无输出

程序的输出将为空!

PERL 初学者教程 - 完整指南

在上面的例子中,你会看到有两个变量被声明,一个在 if 块内 ($var_2),另一个在 If 块外 ($var)。在块外声明的变量可以被 if 块访问,但在 if 块内声明的变量不能被外部程序访问。

本地:使用此功能,我们实际上可以将相同的变量值屏蔽为不同的值,而无需实际改变变量的原始值,假设我们有一个变量 $a,其值被分配为 5,您实际上可以通过使用本地关键字重新声明相同的变量来更改该变量的值,而无需改变变量的原始值 5。让我们通过一个例子看看它是如何工作的。

#!/usr/bin/perl
$var = 5;
{
local $var = 3;
print "local,\$var = $var \n";
}
print "global,\$var = $var \n";

上述程序的输出将是这样的。

本地,$var = 3

全局,$var = 5

这样我们就可以改变变量的值而不影响原始值。

Our:一旦使用访问修饰符“our”声明变量,它就可以在整个包中使用。假设您有一个 Perl 模块或包 test.pm,其中有一个使用范围 our 声明的变量。任何使用该包的脚本都可以访问此变量。

如果你认真对待 Perl 编程,你应该从以下代码开始:

#!/ usr / local / bin / perl

用严格;

这将帮助您编写更好、更干净的代码。'use strict' 打开严格指令,这将使您使用我的关键字声明您的变量。

这是一个良好的编程习惯

#!/usr/local/bin/perl
use strict;
$var = 10;
print "$var";

结果:错误

#!/usr/local/bin/perl
use strict;
my $var = 10;
print "$var";

输出:

10

Perl 数组

什么是 Perl 数组?

数组是一种特殊类型的变量,它以列表的形式存储数据;可以使用索引号访问每个元素,每个元素的索引号都是唯一的。您可以在数组中存储数字、字符串、浮点值等。这看起来很棒,那么我们如何在 Perl 中创建数组呢?在 Perl 中,您可以使用“@”字符后跟要给出的名称来定义数组。让我们考虑在 Perl 中定义一个数组。

我的@array;

这就是我们在 Perl 中定义数组的方式;您可能想知道我们需要如何在其中存储数据。在数组中存储数据的方式有很多种。这取决于您将如何使用它。

my @array=(a,b,c,d);
print @array;

输出:

ABCD

这是一个包含 4 个元素的数组。

数组索引从 0 开始,到其最大声明大小结束,在本例中,最大索引大小为 3。

Perl 数组示例

Perl 数组示例

您也可以用上述方式声明一个数组;唯一的区别是,它将数据存储到数组中,并以空格作为分隔符。 这里,qw() 表示引用词。 此函数的作用是生成一个单词列表。您可以使用 qw 以多种方式声明一个数组。

@array1=qw/a b c d/;
@array2= qw' p q r s'; 
@array3=qw { v x y z};
print @array1;
print @array2;
print @array3;

输出:

ABCDPQRSVXYZ

假设你想给 5 分配一个值th 数组的元素,我们该怎么做呢?

$数组[4] ='e';

顺序数组

顺序数组是按顺序存储数据的数组。假设您想在数组中存储 1-10 个数字或字母 az。您可以尝试以下方法,而不是输入所有字母 -

@numbers= (1..10);
print @numbers;                   #Prints numbers from 1 to 10;

输出:

12345678910

Perl 数组大小

我们有一个已经可用的数组,但您不知道该数组的大小,那么有什么可能的方法可以找到它。

@array= qw/a b c d e/;
print $size=scalar (@array);

我们可以不使用函数来获取数组的大小吗?是的,我们可以。

@array= qw/a b c d e/;
print $size=scalar (@array);
print "\n";
print $size=$#array + 1;                           # $#array will print the Max Index of the array, which is 5 in this case

输出:

5

5

动态数组

上述声明数组的方法称为 静态数组,其中您知道数组的大小。

什么是动态数组?

动态数组是声明时不指定任何值的数组。那么我们究竟何时将值存储在该数组中呢?很简单,我们在运行时存储它们。这是一个简单的程序。

我们将使用一些内置的 Perl 函数来完成这项任务。

my $string="This is a kind of dynamic array";
my @array;
@array=split('a',$string);
foreach(@array)
{
print "$_ \n”;
# This is a special variable which stores the current value.
}

输出:

这是

动态类型

MIC

rr

y

split 函数根据提供给它的分隔符将字符串的内容拆分为数组。此函数还将从字符串中删除分隔符,在本例中为 'a';

Perl 数组的 Push、Pop、shift、unshift:

这些函数可以在 Perl 中使用来添加/删除数组元素。

  • Perl Push:在现有数组的末尾添加数组元素。
  • Perl Pop:从数组中删除最后一个元素。
  • Perl的 Shift:从数组中删除第一个元素。
  • Perl Unshift:在数组开头添加一个元素。

Perl 中的数组函数

让我们看一个可以使用以下函数的例子。

@days = ("Mon","Tue","Wed");
print "1st : @days\n";
push(@days, "Thu");                                             # adds one element at the end of an array
print "2nd when push : @days\n";
unshift(@days, "Fri");                                          # adds one element at the beginning of an array
print "3rd when unshift : @days\n";
pop(@days);
print "4th when pop : @days\n";                                 # remove one element from the last of an array.
shift(@days);                                                   # remove one element from the beginning of an array.
print "5th when shift : @days\n";

输出:

第一天:周一周二周三

第2次推送:周一 周二 周三 周四

第三次取消换班:周五周一周二周三周四

第四流行时间:周五周一周二周三

第5班次:周一周二周三

Perl 哈希

为什么我们需要Hash?

我们已经在前面的章节中了解了标量和数组。

标量到底起什么作用?它只存储整数和字符串。

数组到底是做什么的?它是标量的集合,您可以使用索引访问数组的每个元素。但是,当您有数百和数千条记录时,使用数组是个好主意吗?我们会忘记哪个索引有什么值。为了克服这种情况,我们有类似 perl hash 的东西。

什么是哈希?

哈希还可以容纳与数组一样多的标量。唯一的区别是我们没有索引,而是有键和值。可以声明哈希,以 % 开头,后跟哈希的名称。让我们看一个例子,说明如何定义 Perl 哈希以及如何将其与数组区分开来

考虑三个人的例子,他们的年龄用数组表示。

@array=('Sainath',23,'Krishna',24,'Shruthi',25);        #This is how an array looks.
print @array;

输出:

赛纳斯33Krishna24 Shruthi25

这样就很难知道个人年龄,因为我们需要记住所有人姓名和年龄的索引位置。当你有 3 个名字时,这可能很简单,但是当你有 1000 个或更多名字时?你知道答案。

Perl 中的哈希

我们可以使用哈希来解决这个问题。

哈希示例:

print %hash=( 'Sainath' => 23, 'Krishna' => 24, 'Shruthi' => 25); # This is how we create a hash.
print %hash=('Sainath',23,'Krishna',24,'Shruthi',25);# This way of assigning is called list.

输出:

赛纳斯33Krishna24 什鲁蒂25 赛纳特33Krishna24 Shruthi25

现在我们已经声明了一个哈希,太棒了!但是,我们如何访问或打印它呢?哈希中的每个元素都应该使用其关联的键来访问,并且会为其分配一个值。因此,哈希中的每个键和值之间都有一一映射。

为了打印任何人的年龄,您只需要记住该人的名字。

print $hash{'Krishna'};          # This how we should access a hash. Key enclosed within {}.

你可能想知道为什么我使用 $hash{KeyName},记住哈希又是标量的集合。因此,我们可以使用代表标量的 $ 来访问每个哈希元素。

Perl 中的哈希示例

注意:哈希中的每个键都应该是唯一的,否则它将覆盖之前分配的值。

我们如何将一个哈希赋值给另一个哈希?很简单,方法和我们之前对

我们还可以打印整个哈希。

%hash=( 'Tom' => 23);
%newHash=%hash; # Assigning hash to a new hashprint %newHash; 
print %newHash;

输出:

Tom23

添加 Perl 哈希

如您所见,我们已经有一个哈希%newHash,现在我们需要向其中添加更多条目。

$newHash{'Jim'}=25;
$newHash{'John'}=26;
$newHash{'Harry'}=27;
print %newHash;

输出:

吉姆25约翰26哈利27

Perl 删除键

您可能想要从哈希中删除一个条目。我们可以这样做。

delete $newHash{'Jim'};#This will delete an entry from the hash.

Delete 是 Perl 的一个内置函数。在这里,我们将看到一个将哈希分配给数组的示例。

@array=%newHash;
print "@array";

注意:无论何时打印哈希值或将哈希值存储到数组中,顺序可能总是不同的。它并不总是相同的。

我们只能将哈希的键或值分配给数组。

@arraykeys= keys(%newHash);
@arrayvalues=values(%newHash);
print "@arraykeys\n";
print "@arrayvalues\n";    # \n to print new line.		

要删除哈希中的所有条目,我们可以直接将哈希分配给 null。

%newHash=();# 这将重新定义没有条目的哈希。

Perl 条件语句

我们可以在 Perl 中使用条件语句。那么,什么是条件语句?条件语句实际上是检查代码中某些情况是否满足的语句。

举个例子,你要买一些水果,你不希望价格超过 100 美元。所以,这里的规则是 100 美元。

Perl 支持两种类型的条件语句;它们是 if 和 except。

Perl 如果

当条件为真时,将执行 If 代码块。

Perl 条件语句

my $a=5;
if($a==5)
{
   print "The value is $a";
}

输出:

5

Perl If Else

这看起来不错。让我们考虑一下 $a 不为 5 的情况。

my $a=10;
if($a==5)
{
    print "The values is $a ---PASS";
}
else
{
    print "The value is $a ---FAIL";
}

输出:

值为 10 — 失败

这样我们每次只能控制一个条件。这是个限制吗?不,你还可以使用 if…elsif…else 来控制各种条件。

Perl 否则如果

my $a=5;
if($a==6)
{
    print "Executed If block -- The value is $a";
}
elsif($a==5)
{
    print "Executed elsif block --The value is $a";
}
else
{
    print "Executed else block – The value is $a";
}

输出:

执行 elsif 块 – 值为 5

在上面的例子中,当 $a 等于 5 时,elsif 块将被执行。

在某些情况下,if 和 elsif 代码块都会失败。在这种情况下,else 代码块将被执行。如果您不想包含 else 代码检查,实际上可以消除它。

Perl 嵌套 If

在这种情况下,您可以在另一个 if 代码块中使用 if 代码块。

my $a=11; #Change values to 11,2,5 and observe output
if($a<10){
  print "Inside 1st if block";
        if($a<5){
                print "Inside 2nd if block --- The value is $a";
        }
        else{
                print " Inside 2nd else block --- The value is $a";
        }
	}
	else{
        	print "Inside 1st else block – The value is $a";
    }

输出:

在第一个 else 块中 – 值为 1

通过改变$a的值执行相同的代码;您可以找出其余部分。

Perl 除非

你已经知道 if 的作用了(如果条件为真,就会执行代码块)。Unless 与 if 相反,如果条件为假,就会执行 Unless 代码块。

my $a=5;
unless($a==5)
{
   print "Inside the unless block --- The value is $a";
}
else
{
   print "Inside else block--- The value is $a";
}

输出:

在第一个 else 块中 – 值为 1

猜猜输出结果是什么。你猜对了!输出结果将是 else 块的打印语句。由于 except 代码块中的条件为真,请记住,只有当条件为假时,unless 块才会执行。更改 $a 的值并执行代码,你会看到差异。

Perl 使用 if

$a= " This is Perl";
if($a eq "SASSDSS"){
print "Inside If Block";
}
else
{
print "Inside else block"
}

输出:

else 块内部

使用unless

$a= " This is Perl";
unless($a eq "SASSDSS"){
print "Inside unless Block";
}
else
{
print "Inside else block"
}

输出:

除非阻止内部

Perl 循环 – 控制结构

Perl 支持与其他编程语言类似的控制结构。Perl 支持四种类型的控制结构 for、foreach、while 和 till。我们使用这些语句来重复执行一些代码。

Perl 的 For 循环

For 代码块将一直执行直到条件满足。让我们举一个例子来说明如何 Perl 循环数组。

my @array=(1..10);
for(my $count=0;$count<10;$count++)
{
    print "The array index $count value is $array[$count]";
    print "\n";
}

输出:

数组索引 0 的值为 1

数组索引 1 的值为 2

数组索引 2 的值为 3

数组索引 3 的值为 4

数组索引 4 的值为 5

数组索引 5 的值为 6

数组索引 6 的值为 7

数组索引 7 的值为 8

数组索引 8 的值为 9

数组索引 9 的值为 10

这里的for()表达式中,包含了很多语句,每个语句都有其含义。

for(初始化;条件;递增)

这是使用 for 的另一种方法。

for(1..10)
{
    print "$_ n";
    print "\n";
}

输出:

1n

2n

3n

4n

5n

6n

7n

8n

9n

10n

Perl 的 Foreach

for each 语句的使用方式与 for 相同;主要区别在于我们没有任何条件检查和递增。

我们以 foreach perl 为例。

my @array=(1..10);
foreach my $value (@array)
{  
	print " The value is $value\n";
}

输出:

值为 1

值为 2

值为 3

值为 4

值为 5

值为 6

值为 7

值为 8

值为 9

值为 10

Foreach 取数组中的每个元素,并在每次迭代时将该值赋给 $var。我们也可以使用 $_ 来实现相同的效果。

my @array=(1..10);
foreach(@array)
{
    print " The value is $_ \n"; # This is same as the above code.
}

输出:

值为 1

值为 2

值为 3

值为 4

值为 5

值为 6

值为 7

值为 8

值为 9

值为 10

这看起来非常适合访问数组。那么哈希呢?我们如何使用 foreach 获取哈希键和值?

我们可以使用 foreach 通过循环来访问哈希的键和值。

Perl 中的 For 循环

my %hash=( 'Tom' => 23, 'Jerry' => 24, 'Mickey' => 25);
foreach my $key (keys %hash)
{
print "$key \n";
}

输出:

米奇

Tom

杰瑞

您可能想知道,为什么我们在 foreach() 中使用 Keys。Keys 是 Perl 的一个内置函数,我们可以通过它快速访问哈希的键。值呢?我们可以使用 values 函数来访问哈希的值。

my %hash=( 'Tom' => 23, 'Jerry' => 24, 'Mickey' => 25);
foreach my $value(values %hash) # This will push each value of the key to $value
{
	 print " the value is $value \n";
}

输出:

该值为 24

该值为 23

该值为 25

Perl 虽然

Perl While 循环是一种控制结构,其中的代码块将一直执行直到条件为真。

仅当条件为假时,代码块才会退出。

让我们以 Perl While 循环为例。

Perl 中的 While 循环

这是一个问题,它需要用户输入,直到提供的数字为“7”才会退出。

#!/usr/bin/perl
$guru99 = 0;
$luckynum = 7;
print "Guess a Number Between 1 and 10\n";
$guru99 = <STDIN>;
while ($guru99 != $luckynum)
{
	print "Guess a Number Between 1 and 10 \n ";
	$guru99 = <STDIN>;
}
print "You guessed the lucky number 7"

输出:

猜一个 1 到 10 之间的数字

9

猜一个 1 到 10 之间的数字

5

猜一个 1 到 10 之间的数字

7

你猜对了幸运数字 7

在上面的例子中,如果我们输入的不是“7”,则 while 条件将不成立。

如果您看到这里的 while 工作原理,则仅当 while 中的条件为真时才会执行代码块。

Perl 的 do-while 命令

即使 while 部分中的条件为假,Do while 循环也会执行至少一次。

让我们使用 do while 来举同样的例子。

$guru99 = 10;
 do {
 print "$guru99 \n";
 $guru99--;
 } 
 while ($guru99 >= 1);
 print "Now value is less than 1";

输出:

10

9

8

7

6

5

4

3

2

1

现在值小于 1

Perl 直到

Until 代码块类似于条件语句中的 Unless。这里,只有当 Until 块中的条件为假时,代码块才会执行。

让我们采用在一段时间内使用的相同示例。

这里有一个问题,它将需要用户输入,并且直到提供的名称不是“sai”时才会退出。

print "Enter any name \n";
 my $name=<STDIN>;
 chomp($name);
 until($name ne 'sai')
 {
    print "Enter any name \n";
    $name=<STDIN>;
    chomp($name);
 }

输出:

输入任意名称 sai

Perl 直到:

仅当我们需要一个条件为假时才可以使用 Do Until,并且它至少要执行一次。

print "Enter any name \n";
 my $name=<STDIN>;
 chomp($name);
 do
 {
     print "Enter any name \n";
     $name=<STDIN>;
    chomp($name);
 }until($name ne 'sai');

输出:

输入任意名字 Howard

输入任意名字 Sheldon

输入任意名称 sai

执行 while、do-while、until 和 do-until 示例代码来查看区别。

Perl的 Opera器

什么是 Opera托尔?

Opera计算机语言中的 tors 表示可以对计算机可以理解的一组变量或值执行的操作。Perl 已经吸收了大多数 Opera不同于 C 语言,Perl 的运算符比其他编程语言多。 Opera运算符分为算术运算符、逻辑运算符、关系运算符和赋值运算符。

算术 Opera目的:

算术运算符可用于执行一些基本的数学运算。这些算术运算符是二元运算符,我们需要两个参数来执行基本运算。我们还可以使用一元运算符进行其他基本运算;您可以在下面的示例中看到差异。

Opera器 描述 例如:

+

加法运算用于添加两个值或变量

持有价值

$x=5+6; # 或

$y=6;

$z=$x+$y;

减法运算符用于减去两个值或保存值的变量

$x=6-5; # 或

$y=6;

$z=$x-$y;

*

乘法运算符用于将两个值或保存值的变量相乘

$x=6*5; # 或

$y=6;

$z=$x*$y;

/

除法运算符用于除以两个值或保存值的变量

$x=36/6; # 或

$y=6;

$z=$x/$y;

**

指数运算符用于提供指数并获取值。

例如:22 = 4、33 = 27

$x=5**5; # 或

$x=4;

$y=2;

$z=$x**$y;

%

模数运算符用于在两个值或保存值的变量相除时获取余数

$x=5%2; # 或

$x=10;

$y=2;

$z=$x%$y;

++

一元加法运算符将变量的值增加 1

$x=5;

$x++;

Or

++$x;

-

一元减法运算符将变量的值减 1

$x=5;

$x--; # 后减量

Or

–$x;# 预减量

示例完成以上所有操作。

my $x=10;
my $y=2;
my $z;
$z=$x+$y;
print ("Add of $x and $y is $z \n");
$z=$x-$y;
print ("Sub of $x and $y is $z \n");
$z=$x*$y;
print ("Mul of $x and $y is $z \n");
$z=$x/$y;
print ("Div of $x and $y is $z \n");
$z=$x**$y;
print ("Exp of $x and $y is $z \n");
$z=$x%$y;
print ("Mod of $x and $y is $z \n");

输出:

10 加 2 等于 12

10 加 2 等于 8

10 加 2 等于 20

10 加 2 等于 5

10 加 2 的乘积为 100

10 和 2 的模数为 0

转让 Opera目的:

赋值运算符只是将值赋给变量,但是这里我们还需要记住一件事,赋值运算符还将执行算术运算并将新值赋给执行运算的同一变量。

Opera器 描述 例如:

+=

加法运算符用于将值添加并赋给同一个变量

$x=4;

$x+=10;

-=

减法运算符用于减去并将值分配给同一变量

$x=4;

$x-=10;

*=

乘法运算符用于将值添加并赋给同一个变量

$x=4;

$x*=10;

/=

除法运算符用于将值除以并赋给同一个变量

$x=4;

$x/=10;

**=

指数运算符用于获取指数并将值分配给同一变量

$x=4;

$x**=10;

%=

模数运算符用于在除法过程中获取余数并将值赋给同一个变量

$x=10;

$x%=4;

示例完成以上所有操作。

my $x=10;
$x+=5;
print("Add = $x\n");
$x-=5;
print("Sub= $x\n");
$x*=5;
print("Mul = $x\n");
$x/=5;
print("Div = $x\n");

输出:

添加 = 15

子= 10

乘数 = 50

股息 = 10

逻辑和关系 Opera目的:

Perl 使用逻辑运算符来比较数字和字符串。大多数情况下,逻辑运算符用于条件语句。

逻辑和关系 OperaPerl 中的函数

逻辑和关系 OperaPerl 中的函数

Opera器 描述

== 或 eq

Opera用于检查两个变量是否相等

!=或 ne

Opera用于检查两个变量是否不相等

> 或 gt

Opera用于检查

A大于B

<or lt

Opera用于检查

A小于B

>=或 ge

Opera用于检查

A 大于或等于 B

<=或 le

Opera用于检查

A 小于或等于 B

|| 或 或

Opera用于检查 A 或 B 是否持有价值

&&或和

Opera用于检查 A 和 B 是否持有价值

让我们举一个例子来解释所有的情况。

my $x=5;
my $y=5;
if($x == $y){
print ("True -- equal $x and $y \n");
}
else{
print ("False -- not equal $x and $y\n");
}
$x=6;
$y=7;
if($x != $y){
print ("True -- not equal $x and $y\n");
}
else{
print ("False -- equal $x and $y\n");
}
if($y > $x){
print ("True -- $y greater than $x\n");
}
else{
print ("False -- $y greater than $x\n");
}
if($x < $y){
print ("True -- $x less than $y\n");
}
else{
print ("False -- $x less than $y\n");
}
if($x <= $y){
print ("True -- $x less than $y\n");
}
else{
print ("False -- $x less than $y\n");
}
if($y >= $x){
print ("True -- $y greater than $x\n");
}
else{
print ("False -- $y greater than $x\n");
}

输出:

正确 — 等于 5 和 5

正确 — 不等于 6 和 7

正确 — 7 大于 6

正确 — 6 小于 7

正确 — 6 小于 7

正确 — 7 大于 6

您可以在后面的章节中看到逻辑运算符的示例。

Perl 特殊变量

什么是 Perl 特殊变量?

Perl 中的特殊变量是具有一些预定义含义的变量。这些变量用真实名称或标点符号表示。我们为所有 Perl 支持的变量(如标量特殊变量、数组特殊变量、哈希特殊变量)都提供了一个特殊变量。我们使用的大多数特殊变量都是标量。

当我们想要使用带有名称的特殊变量时,我们必须加载一个 Perl 模块“使用英语”,以明确地告诉 Perl 解释器我们将使用其名称来使用特殊变量。

标量特殊变量

请按需咨询 描述

$_$ARG

这是存储当前值的默认变量。

$0 或 $PROGRAM_NAME

存储 Perl 脚本的文件名。

$/

输入记录分隔符,其默认值为 '\n',即换行符

$.

保存正在读取的文件的当前行号

$,

输出字段分隔符,主要由 print() 语句使用。默认情况下,此变量的值设置为 0,我们可以更改此变量的值。

$\

输出记录分隔符,此变量的值将为空;我们可以为其分配任何值,该值将在打印输出时由 print() 语句使用。

$#

此变量用于打印数字时的输出格式。

$%$格式页码

将保存读取文件的当前页码。

$=$每页格式行数

将保存当前读取文件的页面长度。

$-$FORMAT_LINES_LEFT

保存页面上剩余要打印的行数值。

$~$格式名称

格式名称:保存当前选定的输出的格式,默认为文件句柄名称。

$^$FORMAT_TOP_NAME

保存文件处理程序的标题格式的值,默认值为 _TOP 后跟文件句柄名称。

$|$输出自动刷新

默认值为零;这用于在每次 write() 或 print() 之后刷新输出缓冲区。

$$

将保存 Perl 解释器的正在运行的进程数。

$?

状态代码:管道和系统调用。执行命令的返回状态。

$&$匹配

在正则表达式中使用,它将保存最后一次成功模式匹配的字符串。

$`$PREMATCH

在正则表达式中使用,它将保存上次成功模式匹配的字符串。

$'$POSTMATCH

在正则表达式中使用,它将保存最后一个成功模式匹配的字符串。

$+$最后一个匹配项

保存最后一次模式搜索匹配的最后一个括号的字符串。

$

$1, $2, $3 .... 按顺序保存匹配的模式的值。

$[

第一个索引:数组,一个子字符串。

$]

Perl 的一个版本。

$”

列表元素使用的分隔符,默认值是空格。

$;

多维数组中使用的下标分隔符

$!

在数字上下文中,打印错误编号。在字符串上下文中,打印错误。

$@

将保存使用 eval() 时使用的语法错误信息。

$<

保存运行脚本的进程的真实 UID (用户 ID)。

$>

保存运行脚本的进程的有效 UID。

$(

保存运行脚本的进程的真实 GID(组 ID)。

$)

保存运行脚本的进程的有效 GID。

$^D$调试

保存调试标志的当前值。

$^C

当使用 –c 命令行开关时保存标志的当前值。

$^F

最大系统文件描述符的默认值设置为 2

$^I$INPLACE_EDIT

保存 –i 命令行开关的值。

$^M

当 Perl 脚本因内存不足错误而终止时,可以使用特殊内存池。

$^O$操作系统名称

Opera系统信息存储。Linux 系统为“Linux”, Windows 系统。

$^T$基本时间

脚本运行的时间(以秒为单位)。

$^W$警告

–w 命令行开关的当前值。警告开关。

参数值

当使用 <> 时,当前文件的名称。

数组特殊变量:

请按需咨询 描述

@INC

保存路径列表,在执行当前脚本时可以查看 Perl 库模块或脚本。 use 和 require 语句使用此 @INC 查看库模块的路径。

@ARGV

存储传递的命令行参数。

@_

在子程序中使用,同时将参数传递给子程序。

@F

这是自动分割 -a(使用命令行开关)时存储输入行的数组。

哈希特殊变量:

请按需咨询 描述

%增加

文件名将是键;值将是这些文件的路径。由 do、use 和 require 使用。

%环境

系统环境变量。

%信号

Signal的处理程序。

Perl 正则表达式

什么是正则表达式?

Perl 正则表达式在匹配语句或语句组中的字符串模式方面非常强大。正则表达式主要用于文本解析、模式匹配以及更多基于需求的操作。我们有一些特定运算符,它们专门用于正则表达式模式绑定 =~ 和 !~,它们是测试和赋值运算符。

正则表达式 Opera职权范围

正则表达式 OperaPerl 中的函数

正则表达式 OperaPerl 中的函数

  • Perl 匹配 — m//
  • Perl 替代品 – s///
  • Perl 音译 – tr///

在进一步讨论之前,我们需要了解一些有关正则表达式的知识;Perl Regex 语法中包含元字符、通配符等内容。

夏亚

\

特价或报价

*

匹配 0 个或更多字符

+

匹配 1 个或更多字符

?

匹配 0 个或 1 个字符

|

可用于匹配替代模式

()

用于存储匹配的模式

[]

可以传递字符集。特别用于数字和字母。

{}

用于提供比赛可进行的次数。

^

字符串的开头

$

字符串结尾

\w

用于匹配单个字符或单词,可以是字母数字,包括“_”

\W

匹配除字母数字之外的任何内容

\s

用于匹配空格

\S

匹配除空格之外的任何内容

\d

匹配数字。不是小数和负值

\D

匹配数字以外的任何内容。

\t

匹配制表符空格

\n

匹配换行符

以上是在模式匹配期间可以使用的字符集。

让我们看几个例子。

考虑这样一种情况,用户在脚本执行期间提供了一些输入,我们想检查用户是否输入了某个名称。我们必须编写一个正则表达式语法来提取您的姓名并打印出来。

my $userinput="Guru99 Rocks";
if($userinput=~m/.*(Guru99).*/)
{
	print "Found Pattern";
}
else
{
	print "unable to find the pattern";
}

输出:

找到模式

这里,我们将正则表达式写为 /.*(Guru99).*/.* 匹配字符串中的所有字符。perl 正则表达式匹配中的“.”指包括空格在内的任何字符。

让我们看看如何精确地构建一个正则表达式。

考虑一个由多个单词、数字和特殊符号组成的字符串的例子,例如“大家好,这是我的电话号码:+91-99298373639”;

正则表达式:/^\w+\s\w+\s\w+\s\w+\s\w+\s\w+\s\w+\:\+\d+\-\d+/i

单词空格 单词空格 单词空格 单词空格 单词空格 特殊字符:空格 特殊字符+数字 特殊字符-数字。

Perl 匹配 Opera职权范围

匹配运算符用于匹配某些语句或变量中的字符串。

my $var="Hello this is perl";
if($var=~m/perl/)
{
	print "true"; 
} 
else
{
	print "False"; 
}

输出:

true

这段小代码将打印“true”,因为 perl 模式匹配会识别变量中的字符串。基本上,Perl 会在整个字符串中搜索 // 中提供的文本,即使只在一个地方找到,它也会返回“true”。模式可以位于变量中的任何位置。我们可以尝试用 !~ 替换 =~ 来查看这两个运算符之间的区别。

Perl 替换 Opera器

该运算符可用于搜索任何字符并将其替换为空字符或其他字符。

my $a="Hello how are you";
$a=~s/hello/cello/gi;
print $a;

输出:

大提琴你好吗

注意:我们实际上也可以使用任何模式匹配字符串,就像我们之前在这个替换运算符中所做的那样。这里我们使用了“gi”,g-全局,i-忽略大小写。

Perl 翻译 Opera器

这与替换类似,但它不使用任何 perl 正则表达式,而是我们可以直接传递我们想要替换的值或单词。

my $a="Hello how are you";
$a=~tr/hello/cello/;
print $a;

输出:

你好,牛,你是

Perl 文件输入/输出

Perl 旨在有效地操作文件和 I/O 操作。Perl 的主要优势在于文件解析和处理。Perl 中有许多内置函数和运算符用于文件处理。

基本上,使用 Perl 执行的文件操作都是使用 FILEHANDLE 完成的。我们必须在打开文件进行读取或写入时定义此 FILEHANDLE。

在此 Perl 脚本教程中,您将学习-

Perl 打开文件

我们可以使用 Perl 中的 open() 函数打开文件。

open(FILEHANDLE, "filename or complete path of the file");

现在我们打开了一个文件,现在出现一个问题。它是用于读取还是写入?

Perl 读取文件 & Perl 写入文件

Perl 具有某些模式,需要使用这些模式来读取、写入或附加文件。

Read – open(my $fh,"<filename or complete path of the file"); 
Write – open(my $fh,">filename or complete path of the file");
Append – open(my $fh,">>filename or complete path of the file");

读取文件的几个例子:

在Perl中读取文件

假设我们有一个名为 file.txt 的 perl 文件,里面有几行文本。我们需要打开这个文件并打印它。

open(FH,"<file.txt"); 
while(<FH>)    # Looping the file contents using the FH as a filehandle. 
{
	print "$_";
}
close FH;

or

open(FH,"<file.txt"); 
my @content=<FH>; # specifying the input of the array is FH.
foreach(@content)
{
	print "$_";
}
close FH;

这将在输出屏幕上打印文件内容。

现在,我们将编写一个程序来创建并将数据写入 perl 文件。

在 Perl 中写入文件

open(FH,">test.txt");
my $var=<>;
print FH $var;
close FH;

这将写入运行时提供的输入并创建一个包含输入的文件 test.txt。

上述方法将始终尝试创建一个名为 test.txt 的文件并将输入写入该文件;我们将写入相同的内容以附加该文件。

Perl 中的文件附加操作

open(FH,">>test.txt");
my $var=<>;
print FH $var;
close FH;
模式 描述

<

阅读

+<

读取和写入

>

创建、写入和截断

+>

读取、写入、创建和截断

>>

写入、附加和创建

+>>

读取、写入、附加和创建

现在我们必须了解如何使用基本示例读取、写入和附加文件。

我们将看到更多示例和其他功能,以帮助我们更好地了解文件。

Perl Tell

如果指定,此方法将返回 FILEHANDLER 的当前位置(以字节为单位),否则它将把最后一行视为位置。

open(FH, "test.pl");
while(<FH>)
{
	$a=tell FH;
	print "$a";
}

Perl 搜索

Seek 函数类似于 fseek 系统调用。此方法用于通过指定文件指针开头或结尾后面的字节将文件指针定位到特定位置。

seek FH, bytes, WHENCE;

WHENCE 是文件指针的起始位置。零表示从文件开头设置。

例如:让 input.txt 包含一些数据,如“Hello,这是我的世界”。

open FH, '+<','input.txt';
seek FH, 5, 0;    # This will start reading data after 5 bytes.
$/ = undef;
$out = <FH>;
print $out;
close FH;

输出:

这是我的世界

Perl 取消链接

Unlink 用于删除文件。

unlink("filename or complete file path");

处理目录:

我们还可以处理目录,通过目录我们可以处理多个文件。

让我们看看如何打开一个目录。我们可以使用 opendir 和 readdir 方法。

opendir(DIR,"C:\\Program Files\\"); #DIR is the directory handler.

while(readdir(DIR)) # loop through the output of readdir to print the directory contents.
{
   print "$_\n";
}
closedir(DIR); #used to close the directory handler.

or

opendir(DIR,"C:\\Program Files\\");
@content=readdir(DIR);
foreach(@content)
{
	print "$_\n";
}
closedir(DIR);

这将打印该目录中所有可用的文件。

Perl 文件测试及其含义

-r

检查文件/目录是否可由当前用户/组读取

-w

检查文件/目录是否可由当前用户/组写入

-x

检查文件/目录是否可由当前用户/组执行

-o

检查文件/目录是否属于当前用户

-R

检查文件/目录是否可被真实用户/组读取

-W

检查文件/目录是否可以被该真实用户/组写入

-X

检查文件/目录是否可以由该真实用户/组执行

-O

检查文件/目录是否属于该真实用户

-e

检查文件/目录名称是否存在

-z

检查文件是否存在且大小为零(对于目录始终为 false)

-f

检查 Entry 是否为纯文件

-d

检查 Entry 是否为目录

-l

检查 Entry 是否为符号链接

-S

检查 Entry 是否为套接字

-p

检查 Entry 是否为命名管道(“FIFO”)

-b

检查 Entry 是否为块特殊文件(如可挂载磁盘)

-c

检查 Entry 是否为字符特殊文件(如 I/O 设备)

-u

检查文件或目录是否为 setuid

-g

检查文件或目录是否为 setgid

-k

检查文件或目录是否设置了粘滞位

-t

给定的文件句柄是一个 TTY(根据 isatty() 系统函数,文件名不能通过此测试进行测试)

-T

检查文件是否像“文本”文件

-B

检查文件是否像“二进制”文件

-M

检查文件的修改时间(以天为单位)

-A

检查文件的访问期限(以天为单位)

-C

检查文件的 Inode 修改时间(以天为单位)

Perl 子程序

什么是子程序?

子程序 与其他编程语言中的函数类似。我们已经使用了一些内置函数,如 print、chomp、chop 等。我们可以在 Perl 中编写自己的子程序。这些子程序可以写在程序的任何地方;最好将子程序放在代码的开头或结尾。

PERL 中的子程序

子程序示例

sub subroutine_name 
{
	Statements…;    # this is how typical subroutines look like.
}

现在,我们知道如何编写子程序,我们如何访问它?

我们需要使用以“&”符号为前缀的子程序名称来访问或调用子程序。

sub display
{
	print "this is a subroutine";
}
display();    # This is how we call a subroutine

传递 Perl 参数和 Perl 参数

编写子程序或 perl 函数是为了在其中放置可重用代码。大多数可重用代码都需要将参数传递给子程序。在这里,我们将学习如何将参数传递给子程序。

sub display
{		
	my $var=@_; # @_ is a special variable which stores the list of arguments passed.		
	print "$var is the value passed";		
}		
display(2,3,4);    #this is how we need to pass the arguments.

输出:

3 是传递的值

@_ 是一个特殊的数组变量,用于存储传递给子程序的参数。

Perl的 Shift

我们还可以使用“shift”关键字,每次将一个参数移至变量或 $_[0],$_[1]…,这是 @_ 数组的单个元素

sub display
{		
my $var=shift;		
print "$var is passed";		
}		
display("hello");

输出:

你好已通过

子程序通常用于面向对象编程,也用于可能放置更多可重用代码的地方。

子程序的主要功能是执行某些任务并返回可重用代码的结果。

PERL 初学者教程 - 完整指南

我们可以使用 return 关键字从子程序返回一个值。

sub add
{
my $a=shift;
my $b=shift;
return($a+$b);
}
my $result=add(5,6);
print $result;

输出:

11

$result 将保存 $a 与 $b 相加的值。

我们还可以将哈希和数组直接传递给子程序。

sub hash
{
my %hash=@_;
print %hash;
}
%value= ( 1=>'a', 2=>'b');
&hash(%value);

输出:

1a2b

我们还可以返回一个哈希或一个数组。

sub hashArray
{
my %hash=@_;
print "Inside Sub-routine";
print %hash;
return(%hash);
}
%hash=(1=>'a', 2=>'b');
my(@ret)=hashArray(%hash);
print "After Sub-routine call";
print @ret;

输出:

在子程序2b1a内部在子程序调用2b1a之后

Perl 格式

Perl 有一个机制,我们可以使用它来生成报告。使用此功能,我们可以按照我们想要的方式制作报告,同时将其打印在输出屏幕或文件中。可以使用 Perl 中的 printf 或 sprintf 函数编写简单的格式。

printf "%05d\n", 30;

这将包括数字 30 前面的前导零,使总数字数达到 5。sprintf 也可以使用相同的方法。

sprintf "%05d\n", 30; # This will print the same as printf.

使用printf和sprintf,我们可以得到大多数的Perl格式。对于报告来说,实现起来会比较困难。

Perl 格式

报告示例:

================================================== =========================
姓名 地址 年龄 电话
================================================== =========================
Krishna 钦奈 24 929309242
Shruthi 钦奈 24 929309232

以上是我们需要在 Perl 中以相同方式打印的示例报告。这可以通过使用 perl printf 和 perl sprintf 来实现。它可以使用格式有效地实现。

可以按照以下方式声明格式。

format FORMATNAME=FORMATLIST.

在这里,我们将使用一种特殊的方法写入将数据打印到输出屏幕上或文件中。

图形符号 描述

@

用于表示字段持有者的开始

>

文本右对齐

<

文本左对齐

|

居中对齐

#

如果提供多个​​ #,则为数字。如果提供单个 #,则假定为注释

.

小数点

^

字段持有者的开始也可以用于多行,也可以用于自动换行

~

如果变量为空,则行也应为空

@*

多行。

($name,$addr,$age,$phone)=("krishna","chennai","24","929309242"); 
write;
($name,$addr,$age,$phone)=("shruthi","chennai","24","929309232"); 
write; 
format STDOUT_TOP= 
=============================================================== 
NAME ADDRESS AGE PHONE 
===============================================================
 . 
format STDOUT= 
@<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< @<<< @<<<<<<<<<< 
$name, $addr, $age, $phone 
.

执行代码以查看输出。

我们使用 @ 符号来指定字段持有者或字符串的开始,“<”每个字符。

我们使用 STDOUT 在标准输出上打印。我们可以将其更改为用于将数据写入文件的文件处理程序。

open(REPORT,">test.txt"); 
($name,$addr,$age,$phone)=("krishna","chennai","24","929309232"); 
write REPORT; 
($name,$addr,$age,$phone)=("shruthi","chennai","24","929309232"); 
write REPORT; 
format REPORT_TOP= 
=============================================================== 
NAME ADDRESS AGE PHONE 
===============================================================
 . 
format REPORT= 
@<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< @<<< @<<<<<<<<<< 
$name, $addr, $age, $phone

我们可以将“<”替换为“>”或“|”来改变文本的对齐方式。STDOUT_TOP 用于设计格式的标题。我们还可以使用 FH_TOP(FH 是文件处理程序)将其与文件处理程序一起使用。这会将格式输出到我们正在处理的文件中。

Perl 编码标准

每个程序员都有自己使用某些标准编写代码的感觉;这些标准应该足够熟悉,以便其他程序员可以理解并正确支持代码。

Perl 中的编码标准

Perl 中的编码标准

编写代码既简单又容易。问题出现在需要后期维护时。编写代码时需要遵循适当的指导方针和编码标准。Perl 还定义了一些标准,这些标准对程序员编写代码很有用。建议在编写代码时加载“strict”和“warnings module”。每个模块都有其重要性。Strict 将使我们在使用前声明变量,还会告知您的代码中是否存在任何裸词。也可以通过在 shebang 中将“-w”选项传递给 Perl 解释器来使用警告模块。警告将打印在输出屏幕上。

#!/usr/bin/perl –w

以下是一些标准列表。

  • 使用“严格”和“警告”模块。
  • 删除未使用的变量。
  • 变量名称应该让其他用户能够理解。例如:$name、@fileData 等。
  • 编写脚本时需要文档。
  • 不要对任何值进行硬编码,而是尝试动态获取这些值或要求用户在运行时输入。(文件路径、文件名)。
  • 最大限度地重复使用代码。尽量将可重复使用的代码放在子程序中。
  • 意思是应该给子程序提供全名。
  • 子程序需要附有适当的注释和文档。
  • 始终初始化变量。
  • 始终检查系统调用的返回代码。打开文件可能发生也可能不会发生,如果文件不存在,则此处的返回代码将显示错误状态。

    例如:open(FH,

  • 子程序应该始终返回一个值。
  • 在同一行打开卷曲。
  • 单行 BLOCK 可以放在带花括号的单行中。
  • 在循环期间使用标签,可以在需要时轻松退出循环。
  • 当长短语写为变量名或子程序时,使用下划线。
  • 编码时尝试使用简单的正则表达式。

具有编码标准的完美示例:

#######################################################################
Program to read the file content
# Date: 22-2-2013
# Author : Guru99
########################################################################
#!/usr/bin/perl 
use strict;
use warnings; 
my $line;
open FR, "file.txt" || die("Cannot open the file $!");
while ($line=<FR>) 
{   
	print $line;
} # Looping file handler to print data

Perl 错误处理

什么是异常?

异常是在程序执行期间发生的事件,它会暂停或终止程序。

错误处理

错误处理是每个程序员在编程过程中都必须注意的问题。Perl 还提供了错误处理技术,我们可以利用这些技术捕获错误并进行相应的处理。

Perl 中的错误处理

Perl 中的错误处理

检查程序错误的方法有很多种。我们需要检查正在使用的函数的返回代码。如果我们能够正确处理这些返回代码,那么大多数错误处理都可以实现。

如果发生系统调用,将会返回什么?

对于系统调用来说,返回状态会存储在两个特殊变量 $? 和 $! 中。

$!——这将捕获与错误消息相关的错误编号或错误号码。

$? – 这将保存返回状态 system() 函数。

使用 Perl 运算符或逻辑

我们可以在使用系统调用时使用逻辑或运算符进行错误处理。

例如:

open(FH,"<test.txt");

如果文件存在,这将以读取模式打开该文件。

如果文件丢失怎么办?

open(FH,"<test.txt") or die("File not exists $!"); # This will perl exit the program if the file not exists. 
open(FH,"<test.txt") or warn ("File not exists $!"); # This will print a warning message on STDERR

Perl 评估

Eval 函数可以处理致命错误、编译时错误、运行时错误以及在某个时间点终止代码的错误。

Perl Eval 函数可以包含代码块或表达式。Evals 将其中的所有内容视为字符串。

考虑调用脚本中未定义的子程序的情况。在这种情况下,脚本终止并显示“未定义子程序 &XYZ,此错误可在 eval 函数中处理。

evals 块有很多用途;其中一种用途是我们想要在运行时加载特定于操作系统的模块。

例如:除以零会导致致命错误;为了解决这个问题,我们可以将代码放在 evals 块中。

$a=5; 
$b=0; 
eval 
{ 
 '$result=$a/$b'; 
} 
if($@)
{
 print "$@";    # All the error codes returned by evals will get stored in $@. 
}

输出:

C:\Users\XYZ\Text.pl 第 8 行靠近“) 处有语法错误

{“

由于编译错误,C:\Users\XYZ\Text.pl 的执行中止。

示例:使用 perl die 语句进行评估。

sub test 
{ 
die "Dieing in sub test \n"; 
} 
eval 
{ 
test(); 
}; 
print "Caught : $@\n";

输出:

被捕:在子测试中死亡

使用 Perl Try

Perl 不像其他编程语言那样支持 try、catch 和 finally 代码块。我们仍然可以通过加载外部 Perl 模块来使用它们。

使用 Try::Tiny;

使用这个我们可以将你的代码放在try块中并在warn块中捕获错误。

Try::Tiny 使用 $_ 代替 eval 中的 $@。

# 使用 catch 处理程序处理错误

try 
{ 
die "Die now"; 
} 
catch 
{ 
warn "caught error: $_"; # not $@ 
};

最后使用。

my $y;
try 
{ 
 die 'foo' 
}
finally 
{ 
    $y = 'bar' 
};

try 
{ 
    die 'Die now' 
} 
catch 
{ 
    warn "Returned from die: $_" 
} 
finally 
{ 
    $y = 'gone' 
};

输出:

foo 位于 C:\Users\XYZ\Text.pl 第 4 行。

我们可以以这种方式使用 try、catch 和 finally。

尝试 { # 语句 }

catch {# 语句 }

最后 { # 语句 };

Or

try 
{ 
# statement 
} 
finally 
{ 
# statement 
};

输出:

Or

try 
{ 
# statement 
} 
finally 
{ 
# statement 
} 
catch 
{ 
# statement 
};

输出:

Perl 套接字编程

什么是套接字?

PERL 初学者教程 - 完整指南

套接字是两台计算机利用网络地址和端口在网络上进行交互的媒介。

假设 A(服务器)和 B(客户端)是两个系统,它们必须使用 Socket 相互交互以运行某些程序。

为了实现这一点,我们需要在 A(服务器)和 B(客户端)中创建套接字,A 将处于接收状态,而 B 将处于发送状态。

A (服务器):

这里,服务器希望从 B(客户端)接收连接并执行一些任务,然后将结果发送回 B(客户端)。当我们执行代码时,A 中的操作系统会尝试创建一个套接字并将一个端口绑定到该套接字。然后它将从发送方(即 B)进行监听。

B(客户)。

这里,客户端希望将一些程序从其系统发送到 A(服务器)进行处理。当我们执行代码时,B 中的操作系统会尝试创建一个用于与 A(服务器)通信的套接字,B 必须指定 B 希望连接的 A 的 IP 地址和端口号。

如果一切顺利,两个系统将通过一个端口进行交互以交换信息。Perl 还支持套接字编程。

Perl 有一个原生 API,通过它可以实现套接字。为了方便起见,我们可以使用许多 CPAN 模块来编写套接字程序。

服务器操作:

  • 创建套接字
  • 将套接字与地址和端口绑定
  • 监听该端口地址上的套接字
  • 接受尝试使用服务器的端口和 IP 进行连接的客户端连接
  • 执行操作

客户 Opera位置:

  • 创建套接字
  • 使用端口地址连接到服务器
  • 执行操作

客户服务器 OperaPerl 中的

套接字

这是一个基于面向对象编程的套接字编程模块。此模块不支持网络中使用的 INET 网络类型。

IO::套接字::INET:

该模块支持 INET 域,基于 IO::Sockets 构建。IO::Sockets 中可用的所有方法均在 INET 模块中继承。

使用TCP协议的客户端和服务端:

TCP 是一种面向连接的协议;我们将使用该协议进行套接字编程。

在继续之前,让我们看看如何为 IO::Socket::INET 模块创建一个对象并创建一个套接字。

$socket = IO::Socket::INET->new(PeerPort => 45787, 
PeerAddr => inet_ntoa(INADDR_BROADCAST), 
Proto => udp,LocalAddr => 
'localhost',Broadcast => 1 )
or 
die "Can't create socket and bind it : $@n";

IO::Socket::INET 模块中的新方法接受哈希作为子例程的输入参数。此哈希是预定义的,我们只需为要使用的键提供值即可。此哈希使用的键有一个列表。

对等体地址

远程主机地址

点对点主机

PeerAddr 的同义词

点对点端口

远程端口或服务

本地地址

本地主机绑定地址

本地主机

LocalAddr 的同义词

本地端口

本地主机绑定端口

协议名称(或编号)

类型

套接字类型

试听

监听队列大小

重用地址

绑定之前设置 SO_REUSEADDR

重用

绑定之前设置 SO_REUSEADDR

重用端口

绑定之前设置 SO_REUSEPORT

广播 Broadcast

绑定之前设置 SO_BROADCAST

超时

各种操作的超时值

多宿主

尝试多宿主主机的所有地址

闭塞

确定连接是否处于阻塞模式

服务器

use IO::Socket; 
use strict; 
use warnings; 
my $socket = new IO::Socket::INET ( 
LocalHost => 'localhost', 
LocalPort => '45655', 
Proto => 'tcp', 
Listen => 1, 
Reuse => 1, 
); 
die "Could not create socket: $!n" unless $socket; 
print "Waiting for the client to send datan"; 
my $new_socket = $socket->accept(); 
while(<$new_socket>) { 
print $_; 
} 
close($socket);

客户端.pl

use strict; 
use warnings; 
use IO::Socket; 
my $socket = new IO::Socket::INET ( 
PeerAddr => 'localhost', 
PeerPort => '45655', 
Proto => 'tcp', 
); 
die "Could not create socket: $!n" unless $socket; 
print $socket "Hello this is socket connection!n"; 
close($socket);

请注意:

在套接字编程中,如果我们在本地主机上运行,​​则必须首先执行 Server.pl,然后在不同的命令提示符中分别执行 client.pl。

什么是 Perl 模块和包

模块和包彼此紧密相关且相互独立。包:Perl 包也称为命名空间,其中包含所有使用的唯一变量,如哈希、数组、标量和子例程。模块:模块是可重用代码的集合,我们在其中编写子例程。这些模块可以加载到 Perl 程序中,以利用在这些模块中编写的子例程。

什么是 Perl 模块?

在任何系统上安装 Perl 时都会安装标准模块。CPAN:综合 Perl Archive 网络 – Perl 模块的全球存储库。我们自己定制的 Perl 模块可以由我们编写。基本上,模块在任何脚本中加载时都会导出其所有全局变量和子例程。这些子例程可以直接调用,就像它们是在脚本本身中声明的一样。Perl 模块可以用 .pm 扩展名写入文件名,例如:Foo.pm。可以在程序开头使用“package Foo”来编写模块。

基本 Perl 模块:

#!/usr/bin/perl 
package Arithmetic; 
sub add 
{ 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a+$b);
} 
sub subtract 
{ 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a-$b); 
} 
1;

无输出

要使用这个 Perl 模块,我们必须将它放在当前工作目录中。

我们可以在代码的任何地方使用 require 或 use 来加载 Perl 模块。require 和 use 之间的主要区别在于,require 在运行时加载模块,而 use 在编译时加载模块。

#!/usr/bin/perl
require
Arithmetic;
print Arithmetic::add(5,6);
print Arithmetic:: subtract (5,6);

在这里,在上面的例子中,我们使用完全限定的模块名称访问子程序。

我们还可以使用“使用算术”来访问该包。

出口商:

该模块具有导入方法的默认功能。

#!/usr/bin/perl 
package Arithmetic; 
require Exporter; 
@ISA= qw(Exporter); # This is basically for implementing inheritance. 
@EXPORT = qw(add); 
@EXPORT_OK = qw(subtract); 
sub add 
{ 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a+$b); 
} 
sub subtract 
{ 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a-$b);
 } 
1;

@EXPORT 数组可用于传递变量和子程序列表,默认情况下这些变量和子程序将被导出给模块的调用者。

@EXPORT_OK 数组可用于传递将根据需要导出的变量和子程序列表,用户必须在加载模块时指定。

#!/usr/bin/perl 
use 
Arithmetic qw(subtract); 
print add(5,6); 
print subtract (5,6);

默认情况下,add 子程序将被导出。如果在加载模块时未指定,则不会导出 Subtract 方法。

Perl 中的面向对象编程

在本节中,我们将学习如何创建 Perl 面向对象模块。首先,让我们看看什么是对象?对象是一个实例,我们可以使用它来访问、修改和定位任何 Perl 模块中的某些数据。这只不过是使您现有的 Perl 包、变量和子例程像类、对象和方法一样引用其他编程语言。

创建班级

我们已经从上一个主题中了解了如何创建模块。类的目的是存储方法和变量。Perl 模块将具有子例程,这些子例程是方法。我们需要访问这些变量和子例程对象。

Perl 构造函数

Perl 中的构造函数是一种方法,它将执行并返回一个引用,其中模块名称被标记到该引用中。这被称为祝福类。我们使用一个特定的变量来祝福 perl 类,即 bless。

#!/usr/bin/perl 
package Arithmetic; 
sub new 
{ 
my $class=shift;
my $self={}; 
bless $self, $class; 
return $self; 
} 
sub add 
{ 
my $self= shift; 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a+$b); 
}
sub subtract 
{ 
my $self= shift; 
my $a=$_[0]; 
my $b=$_[1]; 
return ($a-$b); 
} 
1;

new 方法用作类的构造函数,此构造函数将为我们创建一个对象并返回给调用此构造函数的脚本。

#!/usr/bin/perl
use Arithmetic;
my $obj= Arithmetic->new(); 
my $result= $obj->add(5,6); 
print "$result";
$result = $obj->subtract(6,5);
print "$result";

在这里,我们需要了解对象是如何创建的。每当我们尝试为类创建对象时,我们都需要使用类的全名。假设,如果 perl 类位于某个 lib\Math\Arithmetic.pm 中。并且,如果我们想从 lib 目录访问这个 perl 类,那么我们必须在脚本中调用时提供该类的完整路径。

使用 lib::Math::Arithmetic;

my $obj = lib::Math::Arithmetic->new();

这就是 Perl 中对象创建的过程。

@INC:

Perl 脚本如何知道库模块在哪里?Perl 只知道脚本的当前目录和 Perl 内置库路径。每当我们使用不在当前目录或 Perl 库路径中的 Perl 模块时,脚本总是会失败。关于 @INC,这是一个数组,它包含它必须查找 Perl 模块的所有目录路径。尝试执行此命令并查看输出结果。

perl –e "print @INC"

这将给出一些输出,这就是 lib 模块可用的路径。每当我们使用任何新的库模块时,我们都需要告诉 Perl 解释器查看 Perl 模块可用的特定位置。

push(@INC, "PATH TO YOUR MODULE");

将此作为您的第一行代码。这将告诉您的解释器查看该路径。或 使用

lib Arithmetic; # List here is your Perl Module location

Perl 析构函数

默认情况下,对象的析构函数在脚本结束时和退出前被调用。这用于从内存中销毁对象。


PERL 与 Shell 脚本

PERL 编程简介

  • 使用 Perl 编程不会引起可移植性问题,这在 shell 脚本中使用不同的 shell 时很常见。
  • Perl 中的错误处理非常简单
  • 由于 Perl 的庞大,您可以轻松用它编写长而复杂的程序。这与不支持命名空间、模块、对象、继承等的 Shell 形成鲜明对比。
  • Shell 的可重用库较少。与 Perl 的 CPAN 相比,简直是小巫见大巫
  • Shell 不太安全。它调用外部函数(mv、cp 等命令取决于所使用的 shell)。相反,Perl 在使用内部函数时会做有用的工作。

PERL 如何在自动化测试中使用

Perl 在自动化领域应用广泛。它可能不是世界上最好的编程语言,但它最适合某些类型的任务。让我们讨论一下 Perl 的用途和用途 自动化测试。

存储测试

使用 Perl 进行存储测试

什么是存储?数据存储在文件中。

假设我们有一个与存储相关的 测试用例 我们必须在一个分区上写入数据,读取并验证数据是否正确写入。

这可以手动完成,但手动测试人员能重复做 10000 次吗?这将是一场噩梦!我们需要自动化

自动化与存储相关的任何工作的最佳工具是 Perl,因为它的文件处理技术, 正则表达式 以及强大的文件解析功能,与其他编程语言相比,其消耗的执行时间最少。

为什么要测试存储? 想象一下大型数据中心,数据将不断从一个系统流向另一个系统,每秒存储 1000 条记录。测试这种存储机制的稳健性至关重要。

惠普、戴尔等许多公司, IBM 许多服务器制造商使用 Perl 作为接口来测试存储和网络领域的功能。NetApp 就是这样一家完全专注于存储的公司,它使用 Perl 作为编程语言来自动化测试用例。

如果你对 Perl 自动化感兴趣,那么建议你了解存储和网络 Concepts.

服务器和网络测试:

使用 Perl 进行服务器和网络测试

使用 Perl 进行服务器和网络测试

PERL 广泛用于服务器正常运行时间和性能监控。

假设一个数据中心有 100 台主机(服务器)。您需要连接到每台主机,远程执行一些命令。您还需要重新启动系统并检查它何时恢复在线。

手动为所有 100 台主机执行此任务将是一场噩梦。但我们可以使用 PERL 轻松实现自动化

使用 PERL 设计实现上述自动化的步骤

  1. 从文件中获取有关主机信息(如 IP、用户名和密码)的输入。
  2. 使用Net::SSH2连接各个系统,建立通道执行命令。
  3. 执行所需的命令集,例如:ls、dir、ifconfig、ps 等。
  4. 重新启动系统。
  5. 等待 10 分钟,系统启动。
  6. 使用 Net::Ping 模块 ping 系统并打印状态。

我们将对上述场景进行编码。

让我们以一个名为 Input.txt 的文件为例,它将存储我们需要连接和执行命令的所有主机的完整信息。

输入.txt

192.168.1.2 root 密码

192.168.1.3 root 密码

192.168.1.4 根 root123

主机检测

use Net::SSH2;
use Net::Ping;
use strict;
use warnings;
my $ping = Net::Ping->new();    # Creating object for Net::Ping
my $SSHObj = Net::SSH2->new();  #Creating object for Net::SSH2
open( FH, "Input.txt" );        # Opening file and placing content to FH
my @hosts = <FH>;
my $ip;
my @ips;
foreach (@hosts)
{
    if ( $_ =~ /(.*)\s+(\w+)\s+(.*)/ )    #Regex to get each info from file
    {
        $ip = $1;
        my $user = $2;
        my $password = $3;
        $SSHObj->connect($ip);
        print "Connecting to host -- $ip --Uname:$user --Password:$password\n";
        my $status = $SSHObj->auth_password( $user, $password );
        print "$status\n";
        die("unable to establish connection to -- $ip") unless ($status);
        my $shell = $SSHObj->channel();
        print "$_\n" while <$shell>;
        $shell->blocking(1);
        $shell->pty('tty');
        $shell->shell();
        sleep(5);
        #Executing the list of command on particular host. Can be any command
        print $shell "ls \n";
        print "$_\n" while <$shell>;
        print $shell "ps \n";
        print "$_\n" while <$shell>;
        print $shell "dir \n";
        print "$_\n" while <$shell>;
        print $shell "init 6\n";    #rebooting the system
        push( @ips, $ip );
    }
}
sleep 600;
foreach (@ips)
{
    if ( $ping->ping($_) )
    {
        print "$_ is alive.\n" if $ping->ping($_);
    }
    else
    {
        print "$_ is not still up --waiting for it to come up\n";
    }
}

网络测试

Perl 不仅限于存储和网络测试。我们还可以使用 PERL 执行基于 Web 的测试。 万维网机械化 一个模块用于 网络测试。基本上,它不会启动任何浏览器来测试 Web 应用程序的功能,而是使用 html 页面的源代码。

我们还可以使用以下方式执行基于浏览器的测试 Selenium IDE、RC、Web 驱动程序。Perl 支持 Selenium.

\n”;#这将在模式匹配完成后保存剩余的字符串。
打印 ”