Perl处理数据(一):s替换、split和join
s替换
m//模式用来匹配文本,也就是说用来找数据。而s///用来查找并替换文本,所以可以用来处理文本文件。在有了正则的基础之后,s///用起来会简单很多。
用法格式为:
$str =~ s/reg/replacement/FLAGS;
它表示用reg去搜索$str中的内容,并将搜索出来的内容替换为replacement。
1.s///的斜线可以替换为其他对称的符号(括号类)或相同的符号。
例如s!!!、s###、s%%%、s()()、s{}{}、s<><>、s[][]等,还可以混用符号,例如s{}##、s{}()等。
$str = "ma xiaofang or ma longshuai";
$str =~ s/ma/gao/g;
print "$str\n";
第二句直接会替换掉原来的$str。
2.s//替换的返回值是替换成功的次数(数量)。
例如上面使用全局替换修饰符g,使得替换了两个"ma",返回值为2,如果去掉全局替换修饰符,则只替换第一个"ma",返回值为1。
所以,通过s///返回值可以当作布尔值来做判断:没有替换成功,将返回0,如果替换成功,则返回值至少为1。
$str ="ma xiaofang or ma longshuai";
print "substituted" if $str =~ s/ma/gao/;
3.还有一种操作符$str !~ s///,它的用法和=~是相同的,只不过它转换了布尔逻辑:替换成功时返回false,替换失败时返回1。
4.由于分组后会立即将分组捕获的结果保存到特殊变量\1和$1中,所以在replacement部分可以使用这些变量。
$str = "gao xiaofang or ma longshuai";
$str =~ s/(gao)(.*)(ma)(.*)/\3$2\1$4/; # \1和$1都可以在replacement中使用
print "$str\n"; # 输出ma xiaofang or gao longshuai
修饰符
除了全局修饰符g外,m//可用的修饰符在s///中基本都可用,最常用的修饰符还是gimsx。此外,s///还有自己的修饰符r和e,稍后解释。
$str = "Gao xiaofang or Ma longshuai";
$str =~ s/(gao).* or (ma).*/$2 xiaofang or $1 longshuai/ig;
print "$str\n";
再例如,压缩空白:
s/(\s)+/\1/g; # 将多个空白缩减成一个
s/^\s+//; # 去除行首空白
s/\s+$//; # 去除行尾空白
s/^\s+|\s+$//; # 去除行首空白和行尾空白
r修饰符
原本s///的返回值是替换成功的次数,使用r修饰符,可以让这个替换操作返回替换后的字符串。几个注意点:
- r修饰符实际上是在替换前先拷贝一份待替换数据,然后在副本上进行替换,所以原始数据不会有任何改变
- r修饰符实际上是返回拷贝后的数据,如果替换成功,则返回替换后的字符串,如果替换失败,则直接返回这个副本
- r修饰符的替换返回结果一定是纯文本字符串,即使它操作的是一个对象
$str = "ma xiaofang or ma longshuai";
print $str =~ s/Ma/gao/igr,"\n"; # 输出替换后的内容
print "$str\n"; # 原始内容不变
$copy = $str =~ s/Ma/gao/igr,"\n"; # 替换后的内容赋值给新的变量
print "$copy\n"; # 输出替换后的内容
如果不使用r修饰符,想要将替换的内容输出,只能先将其保存到一个新的变量中,然后输出这个变量:
$str = "ma xiaofang or ma longshuai";
($copy = $str) =~ s/Ma/gao/ig;
print "$str\n"; # 原始数据不变
print "$copy\n"; # 替换后的数据
如果上面省略了括号,那么表示$str被替换,且将成功替换的次数返回给$copy。
#!/usr/bin/perl
$str = "ma xiaofang or ma longshuai";
$copy = $str =~ s/Ma/gao/ig;
print "$str\n"; # 输出gao xiaofang or gao longshuai
print "$copy\n"; # 输出2
r修饰符在map函数中非常好用,它可以替换一个列表中的某些元素。
例如,下面的map将@list中首字母大写的单词替换为小写。需要注意的是这里使用了{}。
@list = qw(Ma longshuai Gao xiaofang);
@new_list = map {s/([A-Z])([a-z]+)/\L\1\E\2/rg} @list;
print "@new_list\n";
e修饰符
e是一个超神的修饰符,它可以让replacement部分当作一个后执行的表达式。
$str="ma longshuai or ma xiaofang";
$str =~ s/ma/$& x 2/eg;
print $str,"\n";
执行上面的程序,它将输出"mama longshuai or mama xiaofang"
上面的过程大致为:搜索字符串"ma",然后将其保存到特殊变量$&中,在replacement部分,将其重复一次,所以得到"mama"。
甚至,可以用sprintf直接格式化输出替换后的内容。
split函数
split函数用于将字符串分割为一个列表(所以在标量上下文返回的是列表的大小)。
split用法如下:
split /pattern_sep/,$string,limit
其中pattern_sep用于指定分隔符,允许使用正则表达式(一般都是很简单的正则),且可以指定多个分隔符。limit表示最多分割为几个元素,如果指定为1(默认),则表示尽可能多地分隔。,
例如,用split分割字符串abc:def::1234:xyz,分隔符指定为:
$str="abc:def::1234:xyz";
@list = split /:/,$str;
print "list: [@list]\n";
print "list_size: ",scalar(@list),"\n";
上面的字符串分割后将有5个元素:abc,def,空,1234,xyz。
可以加上一个limit参数,限制最多分隔为多少个元素,例如上面指定limit=2,表示只分隔一次:
$str="abc:def::1234:xyz";
@list = split /:/,$str,2; # 返回"abc","def::1234:xyz"两个元素
split在分割字符串的时候,如果分割后字符串首部会出现空字串,split会保留这些空元素,但如果是尾部空字串,则舍弃。
例如:
$str=":::abc:def:1234:xyz::::";
@new_list=join(".",split /:/,$str);
print "@new_list\n"; # 输出:...abc.def.1234.xyz
上面使用了join函数,指定了用"."将split后列表中的各元素连接起来。
split可以指定多个分隔符,且可以使用正则表达式来表示。
例如:
$str="abc:def::12:xyz";
@list = split /::/,$str); # 返回:"abc:def","12:xyz"
@list = split /[:]+/,$str); # 返回:"abc","def","12","xyz"
@list = split /[:0-9]/,$str); # 返回:"abc","def","","","","","xyz"
如果不设置分隔符,那么将认为所有的空白(包括行首空白)都是分隔符,且会将连续的多个空白(即使是多个连续的空行)自动压缩当作一个分隔符,但同时它必须也省略第二个字符串参数。也就是说,这时只能对$_进行处理。如果省略了分隔符,却设置了待处理的字符串参数,则返回空。
$_="abc 123 xyz\tmn\t\tdef\n\nABC";
@arr=split;
print "@arr"; #输出:abc 123 xyz mn def ABC
对省略分隔符做个总结:只要是空白,无论是否在行首,无论是否是换行符,所有连续空白都会被当作单个分隔符。
所以它有点类似于split /\s+/,$str的行为,只不过指定了分隔符的话就会保留行首一个空白。
还可以指定空分隔符,它会将字符串中的每个字符都分隔。
$str="abcdef";
print join(",",split //,$str); # 输出a,b,c,d,e,f
一般来说,分隔符的正则都很简单,如果需要写复杂的模式,请避免在分隔符正则中使用用于分组的括号,因为括号会被当作分隔符。如果想要使用括号,则可以使用非捕获分组(?:)的形式。
join函数
join函数用于将列表中各个元素用给定字符连接起来,和split的行为有点相反。它返回一个列表。
join用法如下:
join $sep,$list
其中$sep只能是字符串,这一点和split不一样。
例如:
print join "-",a,b,c,d,efg; # 输出:"a-b-c-d-efg"
可以将split后的结果用join换一个分隔符连接起来:
$str="abc:def::1234:xyz";
@new_list = join(",",split /:/,$str);
print "@new_list\n"; # 输出:abc,def,,1234,xyz
Perl处理数据(一):s替换、split和join的更多相关文章
- perl的一些小函数——split、join、sort
有时候,我们需要将一个字符串或一行文本通过某种方式转换为单个的元素存储在数组中,或者将许多元素通过某种分割符,将他们组合成一个字符串.perl刚好就提供了这样的功能,通过split或者join分割或组 ...
- python-CSV格式清洗与转换、CSV格式列变换、CSV格式数据清洗【数据读入的三种方法】【strip、replace、split、join函数的使用】
1)CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换: (1)按行进行倒序排列: (2)每行数据倒序排 ...
- 更改sql多条数据,更新替换字符串中固定的字符串
需求产生的背景: 数据库里建库时插入了字典数据,可是这个字典数据,有一些是不准确的,所以就需要把一些固定的数据查出来替换掉. 问题解决逻辑: 大体逻辑是,首先把固定需要替换的字符串提取出来,赋值给变量 ...
- 对json数据key进行替换
原文:https://blog.csdn.net/qq_39750658/article/details/83411897 import java.util.HashMap; import java. ...
- String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- C# 中奇妙的函数–7. String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- C# 中奇妙的函数–String Split 和 Join
很多时候处理字符串数据,比如从文件中读取或者存入 - 我们可能需要加入分隔符(如CSV文件中的逗号),或使用一个分隔符来合并字符串序列. 很多人都知道使用split()的方法,但使用与其对应的Join ...
- 《JavaScript》split和join
首先了解split和join两个函数 split 根据条件截断字符串,返回数组 //str.split(option,length) 字符串转数组 //option:表示分割依据 //length:用 ...
- split和join合写
小骆驼 第一章 简介 1. // input 和截取字符 #!usr/bin/perl use strict; use warnings; while ( <> ) { chomp; pr ...
随机推荐
- Exp7 网络欺诈防范
Exp7 网络欺诈防范 20154305 齐帅 一.实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网站 (2)ett ...
- [swarthmore cs75] Compiler 6 – Fer-de-lance
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第8次大作业. First-class function: It treats function ...
- java集成memcached、redis防止缓存穿透
下载相关jar,安装Memcached,安装教程:http://www.runoob.com/memcached/memcached-install.html spring配置memcached &l ...
- 打造自己Django博客日记
本教程使用的开发环境 本教程写作时开发环境的系统平台为 Windows 10 (64 位),Python 版本为 3.5.2 (64 位),Django 版本为 1.10.6. 建议尽可能地与教程的开 ...
- Java程序CPU使用率过高
Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...
- PyCharm连接远程服务器
PyCharm连接远程服务器 1.Tools->Start SSH session 2.新建一个连接或者选择一个已经存在的sftp 3.选择Edit credentials 填写相关连接信息 4 ...
- Promise实践
一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...
- DB2日常维护常用命令
1.检查是否有僵尸进程 ps -emo THREAD | grep -i Z | grep -i 实例名 2.处理死锁 --第一步:查看所有死锁 db2 get snapshot for lock ...
- VSCode插件开发全攻略(四)命令、菜单、快捷键
更多文章请戳VSCode插件开发全攻略系列目录导航. 命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode. ...
- Oracle Data Guard配置
Oracle Data Guard 的配置在网上有很多资料,但是没有一个完整的,配置下来多少有些问题.在踩了各种坑之后,自己终于配置成功,就想把这过程记录下来. 1 测试环境 主数据库:windo ...