matcmatch with的用法法

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

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

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

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

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

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

因此我们将在Perl中使用三种类型的变量。 scalar变量将以美元符号($)开头它可以存储数字,字苻串或引用 array变量将以符号@开头,它将存储有序的标量列表 最后, Hash变量将以符号%开头并将用于存储键/值对的集合。

Perl将每个变量类型保存在单独的命名空间中 因此,您可以在不担心冲突的情况下为标量变量,数组或散列使用相同的名称 这意味着$ foo和@foo是两个不同的变量。

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

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

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

如果您想使用sendmail发送HTML格式的电子邮件,那么您只需在电子邮件的标题部分添加Content-type: text/html\n 以下是脚本,它将负责发送HTML格式的电子邮件 -

您可以与您的电子邮件服务器管理員联系以获取上述信息如果用户ID和密码尚未提供,则您的管理员可以在几分钟内创建它

Socket是一种Berkeley UNIX机制,用于在不同进程之间创建虚拟双笁连接 随后将其移植到每个已知的OS上,使得能够跨越在不同OS软件上运行的地理位置的系统之间进行通信 如果不是套接字,系统之间的夶多数网络通信永远不会发生

仔细看看; 网络上的典型计算机系统根据其上运行的各种应用程序接收和发送信息。 此信息被路由到系统洇为为其指定了唯一的IP地址。 在系统上此信息将提供给相关应用程序,这些应用程序可以侦听不同的端口 例如,因特网浏览器在端口80仩侦听从Web服务器接收的信息 我们还可以编写可以监听和发送/接收特定端口号信息的自定义应用程序。

现在让我们总结一下套接字是一個IP地址和一个端口,允许连接通过网络发送和接收数据

为了解释上面提到的套接字概念,我们将以Perl为例进行客户端 - 服务器编程 要完成愙户端服务器架构,我们必须执行以下步骤 -

  • 使用bind调用将套接字绑定到端口地址

  • 使用listen调用listen端口地址处的套接字。

  • 使用accept调用接受客户端连接

下图显示了客户端和服务器用于彼此通信的完整调用序列 -

socket()调用是建立网络连接的第一个调用是创建套接字。 此调用具有以下语法 -

上面的調用创建一个SOCKET其他三个参数是整数,它们应具有以下TCP / IP连接值

所以服务器发出的socket函数调用将是这样的 -

socket()调用创建的套接字在绑定到主機名和端口号之前是无用的。 服务器使用以下bind()函数指定它们将从客户端接受连接的端口

这里SOCKET是socket()调用返回的描述符,ADDRESS是包含三个元素嘚套接字地址(用于TCP / IP) -

  • 地址族(对于TCP / IP即AF_INET,可能是系统上的2)

  • 检索所有设置的cookie非常容易。 Cookie存储在CGI环境变量HTTP_COOKIE中它们将具有以下形式。

    以丅是如何检索Cookie的示例

    这将产生以下结果,前提是在调用检索cookie脚本之前已设置cookie

    您可以在互联网上找到许多内置模块,它们为您提供在CGI程序中使用的直接功能 以下是重要的一次。

    package语句将当前命名上下文切换到指定的命名空间(符号表) 因此 -

    • 包是一组代码,它们位于自己嘚命名空间中

    • 命名空间是唯一变量名称的命名集合(也称为符号表)。

    • 命名空间可防止包之间发生变量名冲突

    • 软件包可以构建模块,這些模块在使用时不会破坏模块自身命名空间之外的变量和函数

    • 该包保持有效,直到调用另一个包语句或直到当前块或文件的结尾。

    • 您可以使用:: package限定符显式引用包中的变量

    以下是在文件中包含main和Foo包的示例。 这里使用特殊变量__PACKAGE__来打印包名

    执行上述代码时,会产生以下結果 -

    您可以定义任意数量的名为BEGIN和END的代码块它们分别充当构造函数和析构函数。

    • 每个BEGIN块在加载和编译perl脚本之后但在执行任何其他语句之湔执行

    • 每个END块都在perl解释器退出之前执行。

    • 创建Perl模块时BEGIN和END块特别有用。

    以下示例显示其用法 -

    执行上述代码时会产生以下结果 -

    Perl模块是在庫文件中定义的可重用包,其名称与扩展名为.pm的包的名称相同

    名为Foo.pm Perl模块文件可能包含这样的语句。

    关于Perl模块的几点重要

    • 函数requireuse将加载一個模块

    • 两者都使用@INC中的搜索路径列表来查找模块。

    • 这两个函数requireuse调用eval函数来处理代码

    • 1; 在底部导致eval评估为TRUE(因此不会失败)。

    可以通过調用require函数来加载模块如下所示 -

    您必须注意到子例程名称必须完全限定才能调用它们。 将子例程barblat导入我们自己的命名空间会很好所以峩们不必使用Foo :: qualifier。

    可以通过调用use函数来加载模块

    请注意,我们不必完全限定包的函数名称 use函数将在模块内部添加一些语句的情况下从模塊中导出符号列表。

    然后通过填充名为@EXPORT的列表变量@EXPORT提供符号列表(标量,列表散列,子例程等):例如 -

    当您准备运送Perl模块时就有了創建Perl模块树的标准方法。 这是使用h2xs实用程序完成的 该实用程序随Perl一起提供。 以下是使用h2xs的语法 -

    例如如果您的模块在Person.pm文件中可用,则只需发出以下命令 -

    以下是这些选项的描述 -

    • -A省略了Autoloader代码(最好由定义大量不经常使用的子程序的模块使用)

    因此上面的命令在Person目录中创建以丅结构。 实际结果如上所示

  • MANIFEST(包含包中所有文件的列表)
  • lib /(实际源代码在这里

最后,您将此目录结构转换为文件Person.tar.gz然后您可以发送它。 您必须使用正确的说明更新README文件 您还可以在t目录中提供一些测试示例文件。

Perl解释器有一个目录列表用于搜索模块(全局数组@INC)。

您可鉯通过各种方式使用Perl来根据您的要求创建新流程 本教程将列出几个重要且最常用的创建和管理Perl进程的方法。

  • 您可以使用特殊变量$$$PROCESS_ID来获取当前进程ID

  • 使用任何上述方法创建的每个进程都使用%ENV变量维护自己的虚拟环境。

  • exit()函数总是只退出执行此函数的子进程并且除非所有正茬运行的子进程都已退出,否则整个主进程不会退出

  • 所有打开的句柄都是子进程中的dup() - 因此在一个进程中关闭任何句柄不会影响其他呴柄。

执行任何Unix命令的最简单方法是使用backstick运算符 您只需将命令放在后台操作符中,这将导致执行命令并返回其结果该结果可以存储如丅 -

执行上述代码时,它会列出当前目录中可用的所有文件和目录 -

您还可以使用system()函数执行任何Unix命令其输出将转到perl脚本的输出。 默认情况下它是屏幕,即STDOUT但您可以使用重定向运算符将其重定向到任何文件“ -

执行上面的代码时,它会列出当前目录中可用的所有文件和目录 -

当命令包含$ PATH或$ HOME等shell环境变量时要小心 尝试以下三种情况 -

执行上面的代码时,它会产生以下结果具体取决于shell变量$ PATH中设置的内容。

Perl提供了一个fork()函数它对应于同名的Unix系统调用。 在大多数类似于Unix的平台上fork()系统调用可用,Perl的fork()只是调用它 在某些平台上,例如Windows(其中fork()系統调用不可用)可以构建Perl以在解释器级别模拟fork()。

fork()函数用于克隆当前进程 此调用创建一个在同一点运行相同程序的新进程。 它將子pid返回到父进程0返回子进程,如果fork不成功则返回undef

您可以在进程中使用exec()函数来启动所请求的可执行文件,该文件将在单独的进程区域Φ执行exec()将在退出之前等待它以与该进程相同的退出状态完成。

执行上述代码时会产生以下结果 -

wait()waitpid()可以作为fork()返回的伪进程ID传递。 这些调用将正确等待伪进程的终止并返回其状态 如果你在没有等待你的孩子使用waitpid()函数的情况下进行分叉,你就会积累僵尸 在Unix系统上,您可以通过将$ SIG {CHLD}设置为“IGNORE”来避免这种情况如下所示 -

执行上述代码时,会产生以下结果 -

请注意在伪进程()上使用kill('KILL',(进程列表))通常可能导致内存泄漏因为实现伪进程的线程没有机会清理其资源。

您可以使用kill()函数将任何其他信号发送到目标进程例如,以下将SIGINT發送到进程ID 104和102 -

您可以在Perl模块和脚本中嵌入Pod(Plain Old Text)文档 以下是在Perl代码中使用嵌入式文档的规则 -

使用空行开始您的文档,在开头使用a = head1命令然後使用= cut结束它

Perl将忽略您在代码中输入的Pod文本。 以下是在Perl代码中使用嵌入式文档的简单示例 -

执行上述代码时会产生以下结果 -

如果您要将Pod放茬文件的末尾,并且使用__END__或__DATA__剪切标记请确保在第一个Pod命令之前放置一个空行,如下所示否则之前没有空行= head1 ,许多翻译人员不会将= head1识别為启动Pod块

执行上述代码时,会产生以下结果 -

让我们再看一个相同代码的例子而不读取DATA部分 -

执行上述代码时会产生以下结果 -

Pod是一种易于使用的标记语言,用于编写PerlPerl程序和Perl模块的文档。 有各种转换器可用于将Pod转换为各种格式如纯文本,HTML手册页等。 Pod标记包含三种基本类型的段落 -

  • Ordinary Paragraph - 您可以在普通段落中使用格式代码用于粗体,斜体代码样式,超链接等

  • Verbatim Paragraph - 逐字段落通常用于呈现不需要任何特殊解析或格式囮的代码块或其他文本,并且不应包装

  • Command Paragraph - 命令段落用于对整个文本块进行特殊处理,通常作为标题或列表的一部分 所有命令段落都以=开頭,后跟一个标识符后跟命令可以使用的任意文本,但它很高兴 目前公认的命令是 -

您可以使用Linux上提供的pod2html实用程序将上面的POD转换为HTML,因此它将产生以下结果 -

接下来请考虑以下示例 -

当您使用pod2html将上述POD转换为HTML时,它将产生以下结果 -

以下是标准Perl支持的所有重要功能的列表

  • - 接受傳入的套接字连接

  • - 为I / O准备二进制文件

  • - 获取当前子例程调用的上下文

  • - 更改当前的工作目录

  • - 更改文件列表的权限

  • - 从字符串中删除尾随记录分隔苻

  • - 从字符串中删除最后一个字符

  • - 更改文件列表中的所有权

  • - 获取此数字代表的字符

  • - 为目录查找创建目录新根

  • - 关闭文件(或管道或套接字)句柄

  • - 在一段时间或foreach中可选的尾随块

  • - 中断绑定的dbm文件的绑定

  • - 在绑定的dbm文件上创建绑定

  • - 测试是否了值,变量或函数

  • - 创建一个直接的核心转储

  • - 从散列中检索下一个键/值对

  • - 测试文件句柄的结尾

  • - 捕获异常或编译和运行代码

  • - 放弃这个程序来运行另一个程序

  • - 测试是否存在哈希键

  • - 从文件句柄返囙文件描述符

  • - 使用咨询锁锁定整个文件

  • - 创建一个像这样的新进程

  • - 使用write()函数声明图片格式

  • - 用于格式的内部函数

  • - 从文件句柄中获取下一个芓符

  • - 获取给定组用户ID的组记录

  • - 获取给组名称的组记录

  • - 获取主机记录给出其地址

  • - 获取给定名称的主机记录

  • - 获取下一个主机记录

  • - 返回登录此tty的鼡户

  • - 获取给定地址的网络记录

  • - 获取给定名称的网络记录

  • - 获取下一个网络记录

  • - 找到套接字连接的另一端

  • - 获取给定名称的协议记录

  • - 获取协议记錄数字协议

  • - 获取下一个协议记录

  • - 获取给定用户登录名的passwd记录

  • - 获取给定名称的服务记录

  • - 获取给定数字端口的服务记录

  • - 获取下一个服务记录

  • - 在給定套接字上获取套接字选项

  • - 使用通配符扩展文件名

  • - 使用格林威治时间格式将UNIX时间转换为记录或字符串

  • - 创建意大利面条代码

  • - 定位列表中嘚元素对给定标准测试为true

  • - 将字符串转换为十六进制数

  • - 将模块的名称空间修补到您自己的名称空间中

  • - 在字符串中查找子字符串

  • - 获取数字的整數部分

  • - 系统相关的设备控制系统调用

  • - 使用分隔符将列表加入字符串

  • - 从散列中检索索引列表

  • - 向进程或进程组发送信号

  • - 返回字符串的小写版本

  • - 返回一个字符串,只有小写的下一个字母

  • - 返回字符串中的字节数

  • - 将您的套接字注册为服务器

  • - 为全局变量创建临时值(动态范围)

  • - 使用本地時间将UNIX时间转换为记录或字符串

  • - 获取变量子例程或方法的线程锁定

  • - 检索数字的自然对数

  • - stat是一个符号链接

  • - 将字符串与正则表达式模式匹配

  • - 將更改应用于列表以返回包含更改的新列表

  • - 声明并分配一个局部变量(词法范围)

  • - 在编译时重置某些模块符号或语义

  • - 将字符串转换为八进淛数

  • - 打开文件,管道或描述符

  • - 找到一个角色的数字表示

  • - 声明并分配一个包变量(词法范围)

  • - 将列表转换为二进制表示

  • - 声明一个单独的全局命名空间

  • - 打开一对连接的文件句柄

  • - 从数组中删除最后一个元素并将其返回

  • - 查找或设置上一个/下一个m // g搜索的偏移量

  • - 将列表输出到文件句柄

  • - 将格式化列表输出到文件句柄

  • - 获取子程序的原型(如果有的话)

  • - 将一个或多个元素追加到数组中

  • - 单独引用一个字符串

  • - 加倍引用一个字符串

  • - 引鼡正则表达式魔术字符

  • - 检索下一个伪随机数

  • - 来自文件句柄的固定长度缓冲输入

  • - 从目录句柄获取目录

  • - 确定符号链接指向的位置

  • - 执行系统命令並收集标准输出

  • - 重新开始此循环迭代

  • - 找出被引用的东西的类型

  • - 在运行时从库中加载外部函数

  • - 清除给定名称的所有变量

  • - 从右到左的子字符串搜索

  • - 重新定位随机访问I / O的文件指针

  • - 重置默认输出或执行I / O多路复用

  • - SysV信号量控制操作

  • - 通过套接字发送消息

  • - 准备组文件以供使用

  • - 准备主机文件以供使用

  • - 准备网络文件以供使用

  • - 设置一个进程的好值

  • - 准备协议文件以供使用

  • - 准备服务文件以供使用

  • - 设置一些套接字选项

  • - 删除数组的第一个元素然后返回它

  • - 获取SysV共享内存段标识符

  • - 关闭套接字连接的一半

  • - 返回一个数字的正弦

  • - 在数组中的任何位置添加或删除元素

  • - 使用正则表达式分隔符拆分字符串

  • - 格式化打印成字符串

  • - 获取文件的状态信息

  • - 优化重复搜索的输入数据

  • - 声明一个子程序,可能是匿名的

  • - 获取或改变一部分搅拌器

  • - 创建指向文件的符号链接

  • - 打开文件管道或描述符

  • - 来自文件句柄的固定长度无缓冲输入

  • - 运行一个单独的程序

  • - 固定长度的无缓冲输出到文件句柄

  • - 将变量绑定到对象类

  • - 获取对绑定变量底层对象的引用

  • - 返回自1970年以来的秒数

  • - 返回自我和子进程的已用时间

  • - 返回字符串的大写版本

  • - 返回┅个字符串,只包含大写的下一个字母

  • - 设置文件创建模式掩码

  • - 删除变量或函数定义

  • - 删除一个文件的链接

  • - 将二进制结构转换为普通的perl变量

  • - 将哽多元素添加到列表的开头

  • - 打破绑定到变量的绑定

  • - 设置文件的上次访问权限并修改时间

  • - 测试或设置字符串中的特定位

  • - 等待任何子进程死亡

  • - 等待特定的子进程死掉

  • - 文件测试(-r-x等)

欲搜索的图像它应该是单通道、8-比特或32-比特 浮点数图像
搜索模板,不能大于输入图像且与输入图像具有一样的数据类型
 
比较方法的参数 (目前不用).

假定二叉排序树的根节点指针为root给定的关键字值为key,则查找算法可描述为:

  1. 否则如果key < p->data ,而且 p 的左子树非空则将 p 的左子树根送 p ,转步骤 2 ;否则查找失败,算法结束;
  2. 否则如果 key > p->data ,而且 p 的右子树非空则将 p 的右子树根送 p ,转步骤 2 ;否则查找失败,算法结束

二叉排序树上结点的删除算法

假设要删除嘚结点为 p ,结点 p 的双亲结点为 q 下面分三种情况讨论:

  1. 若 p 为叶子结点,则可直接将其删除:
    //情况1:结点p的双亲结点为q且p为叶子结点,则直接将其删除
     
  2. 若 p 结点只有左子树,或只有右子树则可将 p 的左子树或右子树直接改为其双亲结点 q 的左子树或右子树:
    //情况2:结点p的双亲结点為q,且p只有左子树或只有右子树则可将p的左子树或右子树直接改为其双亲结点q的左子树或右子树。
     
  3. 若 p 既有左子树又有右子树。则先保存p 结点的直接前驱(或直接后继)s 的 data  然后再从二叉排序树中删除 s ,最后将保存起来的 s 结点的 data 赋值给 p 的 data

    该步骤难点在于准确理解 p 结点的矗接前驱或直接后继的概念。

    这里的 p 的直接前驱是指BST的中序遍历序列中紧挨在 p 结点之前一个的结点 s ,在BST中s 位于 p 结点的左子树的最右下方,用 s 的数据代替 p 的数据该二叉树依然是一个二叉排序树。


    同理p 的直接后继是指BST的中序遍历序列中,紧挨在 p 结点之后一个的结点 s 在BSTΦ, s 位于 p 结点的右子树的最左下方用 s 的数据代替 p 的数据,该二叉树依然是一个二叉排序树
    //情况3:结点p的双亲结点为q,且p既有左子树又有祐子树本代码使用直接前驱(也可以直接后继)
     
     

BST查找和删除结点的完整C代码

/* 二叉排序树的查找算法的C代码实现 */
//在给定的BST中插入结点,其數据域为element
 //情况1:结点p的双亲结点为q且p为叶子结点,则直接将其删除
 //情况2:结点p的双亲结点为q,且p只有左子树或只有右子树则可将p的左子樹或右子树直接改为其双亲结点q的左子树或右子树。
 //情况3:结点p的双亲结点为q且p既有左子树又有右子树。本代码使用直接前驱(也可以直接后继)
 
//中序遍历打印BST
 printf("当前二叉查找树的中序遍历结果为:\n");
 
 printf("当前二叉查找树的中序遍历结果为:\n");
 
 







我要回帖

更多关于 match with的用法 的文章

 

随机推荐