Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318774
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类:

2008-12-14 00:59:05

m//用来查找匹配的行或者多行;
s/a/b/寻找a,并用b替换
 
s///g  g修饰符告诉解析器将替换所有匹配符
 
s/\s+/ /g 去掉一行中多余的空白,用一个空格代替。
 
i x s可以继续用来修饰s操作。
 
配对符号可以是其它的样子:
s{foo}{bar}
s#bar#
 
大小写转换的修饰符
 
s/(bar)/\U$1/gi 替换所有bar(不区分大小写)为BAR,\U大写,\L转成小写
 
\u \l只作用于后面一个字符,s/(bar),(foo)/\U$2\E,$1/gi  很复杂的例子,调换$1 $2的位置,并且将$2转换成大写;\E的作用是防止\U的作用继续传染;
 
s/(bar),(foo)/\U\l$2\E,$1/gi 转换成Foo,bar
 
split操作
 
@arr=split/:/,"::ddd:fc:";  默认情况下,开始的空白留下,末尾的空白丢失  
默认时,split的操作对象是$_,分隔符是/\s+/
 
跟split 相反的操作是join
 
$_=join" ",@arr;
将arr中的元素用空格分开join到一个标量中去。
 
将$1 $2 等自动保存到列表
@lines=(/([a-z]+)/ig);   保存匹配的字符串到列表里
 
%hash_table=(/(\w+)\S+(\w+)/g);
 
以下几行代码获得输入的hash列表
 

while(($_=<STDIN>)){
  if(/(\w+)\s+(\w+)/g){
   $hash_table{$1}=$2;
  }
}

foreach (sort keys %hash_table){
  print "$_ => $hash_table{$_}\n";
}

 

贪婪的数量词*

/bar(.*)foo/ 试图寻找bar foo之间的内容,但是.*本身能匹配foo所以,会采取回退的方式搜索最后一个foo和bar之间的内容。这是程序想要的结果嘛?

可以用.*?代替上面的操作,?告诉解析器搜索最近一个foo即可,每次匹配一个.之后就查看接下来的字串是否匹配foo。

可以处理多行的字串

/^bar\b/im  /m选项告诉解析器,输入可能是一个多行字串,匹配第一个词是bar(不区分大小写)的行。

 

open($fh,") || die $!;
$lines=join "",<$fh>; #读入所有行并合并到lines里
$lines=~s/^/readme.txt:/gm; #为每一行加上文件名

为文件中的每一行前面加上文件名。

 

阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~