Perl操作符中绑定和乘号操作符用法解析

本文和大家重点讨论一下绑定Perl操作符和乘号Perl操作符,绑定Perl操作符中双目=~把一个字串和一个模式匹配、替换或者转换绑定在一起,并且Perl提供类似C的Perl操作符(乘)、/(除)、和%(模除)。

绑定Perl操作符

双目=~把一个字串和一个模式匹配、替换或者转换绑定在一起。要不然这些操作会搜索或修改包含在$_(缺省变量)里面的字串。你想绑定的字串放在左边,而Perl操作符本身放在右边。返回值标识右边的Perl操作符的成功或者失败,因为绑定Perl操作符本身实际上不做任何事情。

如果右边的参数是一个表达式而不是模式匹配、子过程或者转换,那运行时该表达式会被解释成一个搜索模式。也就是说,$_=~$pat等效于$_=~/$pat/。这样做要比明确搜索效率低,因为每次计算完表达式后都必须检查模式以及可能还要重新编译模式。你可以通过使用qr//(引起正则表达式)Perl操作符预编译最初的模式的方法来避免重新编译。

双目!~类似=~Perl操作符,只是返回值是=~的对应返回值的逻辑非。下面的表达式功能上是完全一样的:

$string!~/pattern/
not$string=~/pattern/
我们说返回值标识成功,但是有许多种成功。替换返回成功替换的数量,转换也一样。(实际上,转换Perl操作符常用于字符计数。)因为任何非零值都是真,所以所有的都对。最吸引人的真值类型是模式的列表赋值:在列表环境下,模式匹配可以返回和模式里圆括弧相匹配的子字串。不过,根据列表赋值的规则,如果有任何东西匹配并且赋了值,列表赋值本身将返回真,否则返回假。因此,有时候你会看到这样的东西:

if(($k,$v)=$string=~m/(\w+)=(\w*)/){
print"KEY$kVALUE$v\n";
}
让我们分解这个例子。=~的优先级比=高,因此首先计算=~。=~把字串$string绑定与右边的模式进行匹配,右边是扫描你的字串里看起来象KEY=VALUES这样的东西。这是在列表环境里,因为它是在一个列表赋值的右边。如果匹配了模式,它返回一个列表并赋值给$k和$v。列表赋值本身是在标量环境,所以它返回2--赋值语句右边的数值的个数。而2正好又是真——因为标量环境也是一个布尔环境。当匹配失败,没有赋值发生,则返回零,是假。

关于模式规则的更多内容,参阅第五章,模式匹配。

乘号Perl操作符

Perl提供类似C的Perl操作符(乘)、/(除)、和%(模除)。和/的运行和你预料的一样,对其两个操作数进行乘或除。除法是以浮点数进行的,除非你用了integer用法模块。

%Perl操作符在用整数除法计算余数前,把它的操作数转换为整数。(不过,如果必要,它会以浮点进行除法,这样你的操作数在大多数32位机器上最多可以有(以浮点)15位。)假设你的两个操作数叫$b和$a。如果$b是正数,那么$a%$b的结果是$a减去$b不大于$a的最大倍数(也就意味着结果总是在范围0..$b-1之间)。如果$b是负数,那么$a%$b的结果是$a减去$b不小于$a的最小倍数(意味着结果介于$b+1..0之间)。

当useinteger在范围里时,%直接给你由你的C编译器实现的模除Perl操作符。这个Perl操作符对负数定义得不是很好,但是执行得更快。

双目x是复制Perl操作符。实际上,它是两个Perl操作符,在标量环境里,它返回一个由左操作数重复右操作数的次数连接起来的字串。(为了向下兼容,如果左操作数没有位于圆括弧中,那么它在列表环境里也这样处理。)

print'-'x80;#打印一行划线
print"\t"x($tab/8),''x($tab%8);#跳过
在列表环境里,如果左操作数是在圆括弧中的列表,x的作用是一个列表复制器,而不是字串复制器。这个功能对初始化一个长度不定的数组的所有值为同一值时很有用:

@ones=(1)x80;#一个80个1的列表
@ones=(5)x@ones;#把所有元素设置为5
类似,你还可以用x初始化数组和散列片段:

@keys=qw(perlsbeforeswine);
@hash{@keys}=("")x@keys;
如果这些让你迷惑,注意@keys被同时当做一个列表在赋值左边使用和当做一个标量值(返回数组长度)在赋值语句右边。前面的例子在%hash上有相同的作用:

$hash{perls}="";
$hash{before}="";
$hash{swine}="";

【编辑推荐】

  1. 畅谈Perl操作符用法
  2. 解析四大Perl操作符用法
  3. Perl二维数组用法全程剖析
  4. 全面认识Perl操作符
  5. Perl多线程的两种实现方式
免责声明:文章内容不代表本站立场,仅供读者参考。产品相关技术问题请发送工单。 本文链接:https://www.idc.net/help/394990/

为您推荐

开源数据收集引擎 Logstash 讲解和示例讲解

一、概述 Logstash 是一个开源的数据收集和日志处理工具,它是 Elastic Stack(ELK Stack)的一部分,用于从各种数据源中采集、转换和传输数据,以帮助分析和可视化大规模数据。Logstash 通常与 Elasticsearch 和 Ki...

八个开源免费单点登录(SSO)系统

单点登录(SSO)是一个登录服务层,通过一次登录访问多个应用。使用SSO服务可以提高多系统使用的用户体验和安全性,用户不必记忆多个密码、不必多次登录浪费时间。 下面推荐一些市场上最好的开源SSO系统,可作为商业SSO替代。 1.Authelia https://github.com/authelia/authelia ...

浅谈HBase数据结构和系统架构

Part 01 LSM树模型 常见的的关系型数据库,如MySQL、SQL Server、Oracle等,使用B+ Tree作为数据存储与索引的基本结构,非叶子节点只存放索引数据,叶子节点存放所有数据和指向相邻节点的指针,具有高效的范围查询和稳定的查找效率,以及具有较小的读放大和空间放大。采用磁盘随机读写方式,且以磁盘数...

微软Radius平台重构现代应用程序部署

微软的 Azure 孵化团队日前推出一个叫 Radius 的新应用平台。Radius 平台可用于在 Kubernetes、公共云和边缘环境中运行各种现代应用程序。 Radius 是一个开源项目,最初支持的应用程序运行时包括Kubernetes、Azure和AWS,以后还会支持诸如谷歌云平台等云环境。 Mark Russ...

Ext JS3.0正式版发布

Ext JS3.0在经历数次RC版之后,extjs.com终于发布3.0的正式版。总体而言,较2.0改进不大,依然还是原理的组件模型,具体更新及改进如下: ◆提供了参照DWR后与后台的通讯包Direct,支持具有明显的REST风格的CRUD服务 ◆一系列的新的组件和例子,包括有图表(Charting, By YUI F...
返回顶部