tr和y///是等价的。用来实现一一映射,但也有额外的功能,就像Linux下的tr命令一样。

用法:

tr/SEARCH/REPLACEMENT/cdsr
y/SEARCH/REPLACEMENT/cdsr 其中:
c:取search的补集,将search中未找到的字符全都替换成replacement的最后一个字符
d:删除search中出现的字符
s:压缩重复字符,仅仅只需要压缩不需要替换时,可将replacement指定为空
r:返回的不是替换成功的数量,而是替换成功后的内容,和s///的r修饰符是一样的

例如:

1.映射功能

将小写字母e替换为大写字母E。

$str="abcdef";
$str =~ y/e/E/;
print "$str\n";

将小写字母全替换为大写字母。

$str="abcdef";
$str =~ y/[a-z]/[A-Z]/;
print "$str\n";

如果对同一个字母指定不同的映射集,那么第一个映射将生效。

$str="aaa ddd eee fff";
$str =~ tr/aaa/xyz/;
print "$str\n"; # 输出xxx ddd eee fff

2.使用r返回替换后的结果

该修饰符使得处理数据前会先拷贝一份数据,然后对副本数据进行操作,所以原始数据会保持不变。

$str="abcdef";
print $str =~ y/e/E/r;
print $str,"\n";

所以,可以将r修饰符的操作结果赋值给其它变量。

$str="abcde";
$copy = $str =~ y/e/E/r;
print $copy,"\n";
print $str,"\n";

3.用s修饰符压缩字符

$str="abc    ddd eee    ffff";
print $str =~ tr/ //sr;

可以压缩换行符:

$str1="abc\n\nddd\neee    fff";
print $str1 =~ tr/\n //sr;

4.d修饰符删除search中有,但replacement中没有的字符

也就是保留replacement的字符,其余删掉。

例如,直接删除某些字符,不指定replacement,那么search中的字符都被删除。

$str="abc ddd eee fff";
$str =~ y/de//d;
print qq("$str"); # 输出:"abc fff"
$str="abc ddd eee fff";
$str =~ y/de/e/d; # e被保留
print qq("$str");

关于d修饰符,有些复杂。如果search部分指定的不是精确的字符,那么被编译时就不知道是哪些字符需要查找,也就无法从replacement中找到哪些字符需要保留,从而replacement部分变得多余。

$str="abc ddd eee fff";
$str =~ y/[d-f]/e/d; # e不会被保留,得到"abc "
$str =~ y/[def]/e/d; # e不会被保留
$str =~ y/[df]e/e/d; # e不会被保留

5.c修饰符取补集,将search中未指定的字符全部替换为replacement中的最后一个字符

$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/cr; # aaaybbbyyyyyyyy

注意上面,除了a和b外,全都替换成了y字符,x字符被忽略。

如果replacement比search长,则仍然是取replacement的最后一个字符作为替换字符。所以下面的等价:

y/ab/xy/c;
y/ab/zxy/c

所以,指定一个补集的替换字符即可。

如果同时指定了s修饰符,则补集替换后,再压缩。

$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/scr; # aaaybbby

如果指定了d修饰符,则删除所有未在searchlist中的字符,也就是说replacement部分成了多余的:

$str="aaa bbb ccc ddd";
print $str =~ y/ab/xy/dcr; # aaabbb

6.c和d修饰符一起用时,一个取search的补集保留search,一个删除search,如何处理

perl的y///是保留search,但不作补集替换,也就是cd修饰符各生效一部分。也因此,replacement部分是多余的。

$str="abc ddd eee fff";
$str =~ y/df/x/cd;
print qq("$str"); # 返回:dddfff

Perl处理数据(二):tr和y///的更多相关文章

  1. Highcharts属性与Y轴数据值刻度显示Y轴最小最大值

    Highcharts 官网:https://www.hcharts.cn/demo/highcharts Highcharts API文档:https://api.hcharts.cn/highcha ...

  2. Saiku根据入参日期查询出对应的数据(二十)

    Saiku根据入参日期查询出对应的数据 之前好像有写过一篇博客关于saiku date range的,现在进一步更新啦!!! 这里的日期筛选会更完善一些,需要提供两个参数 开始日期与结束日期(star ...

  3. nodejs抓取数据二(列表解析)

    这里做得比较暴力,没有分页取出数据解析,O(∩_∩)O哈哈~,居然没有被挂机.不过解析的坑特别多...不过大部分我想要的数据都拿到了. //解析列表数据 var http = require(&quo ...

  4. Perl处理数据(一):s替换、split和join

    s替换 m//模式用来匹配文本,也就是说用来找数据.而s///用来查找并替换文本,所以可以用来处理文本文件.在有了正则的基础之后,s///用起来会简单很多. 用法格式为: $str =~ s/reg/ ...

  5. php结合redis高并发下,悲观锁解决数据二次写入

    悲观锁 在悲观锁的情况下,为了保证事务的隔离性,就须要一致性锁定读.读取数据时给加锁,其他事务无法改动这些数据.改动删除数据时也要加锁,其他事务无法读取这些数据. 在做数据缓存的时候,通常都是把数据从 ...

  6. perl学习笔记二

    数组: 特殊的数组索引:加入对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大,只要有可用的内存分配给数组.意外增加的数组元素的值为undef. $a[0]="aa"; ...

  7. table的数据行tr上下移动

    昨天帮别人解决一个前端页面表格里的数据行上下移动的前端效果,直奔google找了几个demo,发现demo是实现了效果,但是代码很多,最后还是决定自己用jquery写个吧, 首先将前端效果分析出编程逻 ...

  8. Perl入门(二)Perl的流程控制

    Perl是一种粘性语言,如果你有其他语言的基础的话,你会发现他的流程控制完全和你所知的一模一样. 简单说一下他们的区别: Perl的elsif在其他语言里头可能表示为else if Perl的last ...

  9. oracle xmltype导入并解析Excel数据 (二)规则说明

    规则表字段说明如下: 其中RULE_FUNC_CUSTOMIZE表示,用户自己写函数,去判断数据是否合法,存储的是函数的名字 此函数的参数只有一个,该列的值,字段类型是Varchar2, 校验失败的话 ...

随机推荐

  1. Day12 (黑客成长日记) 函数

    一.递归函数: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. #计算阶乘: def fact(n): if n == 1: return 1 return n ...

  2. [转]Java工程师技术栈--成神之路

    一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...

  3. jQuery事件学习

    1.JS事件的基本知识 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  4. numpy、pandas

    numpy: 仨属性:ndim-维度个数:shape-维度大小:dtype-数据类型. numpy和pandas各def的axis缺省为0,作用于列,除DataFrame的.sort_index()和 ...

  5. Xcopy命令参数使用介绍

    DOS批处理命令,永远是不朽的命令,不仅功能强大,同时,速度也是最快的!但是,很多新手学习计算机,都已经遗忘了本不该忘记的批处理命令 XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷 ...

  6. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...

  7. 使用 VSTS 进行 CI 的过程中,无法识别 .NET Core 2.x 的情况处理

    大概是由于 .NET Core 2.1 还没有正式发布,使用 VSTS 进行持续集成(CI)的过程中,自动 Build 的环节无法识别 .NET Core 2.1 的框架,查看日志会提示如下错误: V ...

  8. 【CSS/JS】如何实现单行/多行文本溢出的省略(...)--老司机绕过坑道的正确姿势

    写前端UI的朋友们也许都遇到过这样的问题:我们需要实现这样一个需求,在一个父级元素中隐藏一个可能过长的文本:   这个文本可能是单行的:   也可能是多行的:   下面我就给大家展示如何简单或优雅地实 ...

  9. Pycharm用Ctrl+鼠标滚轮控制字体大小

    一.pycharm字体放大的设置 File —> setting —> Keymap —>在搜寻框中输入:increase —> Increase Font Size(双击) ...

  10. 画线动画——SVG版和纯CSS版

    概述 我们常常在网站中看到一些画线的动画效果,非常炫酷,大多数这种画线动画效果是通过SVG实现的,也有不少是用纯css实现的,下面我总结了一下这2种方法,供以后开发时参考,相信对其他人也有用. 参考资 ...