Presentation is loading. Please wait.

Presentation is loading. Please wait.

Perl 语言.

Similar presentations


Presentation on theme: "Perl 语言."— Presentation transcript:

1 Perl 语言

2 第九章 用正则表达式处理文本 1 用s///替换 2 相关函数 3 列表上下文中的m// 4 更强大的正则表达式

3 9.1 用s///进行替换 m// 等同于“查询(search)”功能, s ///类似于“查询并替换”
$_ =“He’s out bowling with Barney tonight.”; s/Barney/Fred/; #Barney 被Fred 替换掉 print “$_\n”; s/with (\w+)/agaist $1’s team/; print “$_\n”; #为“He’s out bowling against Fred’s team tonight”

4 9.1 用s///进行替换 $_ =“green scaly dinosaur”;
s/(\w+) (\w+)/$2, $1/; #现在为“scaly, green dinosaur”; s/^/huge, /; #现在为“huge, scaly, green dinosaur” s/,.*een//; #空替换,现在为“huge dinosaur” s/green/red/; #匹配失败,仍然为“huge dinosaur” s/\w+$/($`!)$& /; #现在为“huge (huge !)dinosaur” s//\s+(!\W+)/$1 /; #现在为“huge (huge!) dinosaur” s/huge/gigantic/; #现在为“gigantic (huge!) dinosaur” if (s/huge/gigantic/){ print “It matched!\n” } #s///返回布尔值

5 用/g进行全局替换 s///值进行一次替换,无论是否还有地方还能匹配上。 修饰/g 要求s///将所有匹配上的部分都进行替换:
$_ = “home, sweet home!”; s/home/cave/g; print “$_\n”; # “cave, sweet cave!” 应用:s///g缩减字符串中的空白。 $_ =“Input data\t may have extra whitespace.”; s/\s+/ /g; #现在是“Input data may have extra whitespace.” s/^\s+//; #将开头的空白去掉 s/\s+$//; #将结尾的空白去掉 s/^\s+|\s+$//g; #将开头,结尾的空白去掉

6 不同的定界符 m//和qw//,可以改变使用其他定界符 s///的分隔符也可以。但使用3个分隔符,有些不同。
s{fred}{barney}; s[fred](barney); s<fred>#barney#;

7 可用替换修饰符 除了/g 修饰符外,替换操作中还可使用/i, /x, 和/s,修饰前部分的模式这些在普通的模式匹配中已经出现过的修饰符。无顺序。 s#wilma#Wilma#gi; #所有WilmA(不分大小写),替换Wilma s{_ _END_ _.*}{ }s; #将__END__ 标记及其后面内容去掉

8 无损替换 如果需要同时保留原始字符串和替换后的字符串,传统的办法是先复制一份,再替换 默认状态下,s///返回的成功替换的次数
my $original = ‘Fred ate 1 rib’; my $copy = $original; $copy =~ s/\d+ ribs?/10 ribs/; (my $copy = $original) =~ s/\d+ ribs?/10 ribs/; #先赋值,后替换 my $copy = $original =~ s/\d+ ribs?/10 ribs/r; #先替换,后赋值

9 大小写转换 修饰符\U 要求接下来的字符均是大写: 修饰符\L 要求接下来的字符均是小写:
$_ =“I saw Barney with Fred.”; s/(fred|barney)/\U$1/gi; #$_现在是“I saw BARNEY with FRED.” s/(fred)|barney/\L$1/gi; #$_现在是“I saw barney with fred.” s/(\w+) with (\w+)/\U$2\E with $1/I; #$_ 现在是“I saw FRED with barney.”

10 大小写转换 修饰符\u 要求接下来的一个字符大写: 修饰符\l 要求接下来的一个字符小写:
s/ (fred|barney)/\u$1/ig; #$_现在是“I saw FRED with Barney.” s/(fred|barney)/\u\L$1/ig; #$_现在为“I saw Fred with Barney.” print “Hello, \L\u$name\E, would you like to play a game?\n” #也可以在双引号中使用此修饰符

11 9.2 相关函数 split操作符:根据模式拆分字符串 my @fields = split /separator/, $string;
根据模式扫描字符串,按照模式匹配分隔字符串,如果匹配成功,该处就是当前字段的结尾,下一个字段的开头。任何匹配的内容都不会出现在返回值中。 @fields = split /:/, “abc:def:g:h”; #返回(“abc”, “def”, “g”, “h”) @fields = split /:/, “abc:def::g:h”; #得到(“abc”, “def”, “”, “g”, “h”)

12 9.2 相关函数 如果有两个分隔符是连在一起的,则可能得到空的元素 开头的空元素会被返回,但结尾的空元素被丢弃
@fields = split /:/, “:::a:b:c:::”; #得到(“”, “”, “”, “a”, “b”, “c”); my $some_input = “This is a \t test.\n”; = split /\s+/, $some_input; #(“This”, “is”, “a”, “test.”)

13 9.2 相关函数 默认时,split 对$_操作,模式为空白: my @fields = split; #同split /\s+/, $_;
= split ‘’, ‘abcdef’; #将字符串分解为单个字符;

14 9.2 相关函数 join函数 不使用模式,与split 相反的操作:将这些分割的部分组合成一个整体。
join 函数的第一个参数是‘胶水’,它可以是任意字符串。剩下的参数是要被粘合的部分。join 将粘合元素添加在这些部分之间,并返回其结果: my $x = join “:”, 4, 6, 8, 10, 12; #$x 为“4:6:8:10:12”

15 9.2 相关函数 被粘合的参数至少要有两个元素,否则胶水无法添加 my $y = join “foo”, “bar”; #得到“bar”
#空数组 my $empty = join #没有元素,因此为空串 my $x = join “:”, 4, 6, 8, 10, 12; = split /:/, $x; 为(4, 6, 8, 10, 12) my $z =join #$z 为“ ”

16 9.3 列表上下文中的m// 列表上下文中,模式返回的捕获组得到的列表 $_ =“Hello there, neighbor!”;
my($first, $second, $third) =/(\S+) (\S+), (\S+)/; print “$second is my $third\n”;

17 9.3 列表上下文中的m// /g修饰符,可以使用到s///, 也可以修饰m//,意为匹配到字符串中的对个地方。
my $data = “Barney Rubble Fred FlintstoneWilma Flintstone”; my %last_name = ($data =~ / (\w+)\S+(\w+)/g);

18 9.4更强大的正则表达式 量词:*, + ,? {3,5}---贪婪量词 Perl默认在保证整体匹配的前提下,会尽量匹配长字符串
fred and barney went bowling last night 用/fred.+barney/进行匹配-----大量的回溯动作,直到匹配成功 非贪婪量词----*?, +? ,?? {3,5}? Perl默认会尽量匹配短字符串 fred and barney went bowling last night 用/fred.+barney/进行匹配-----大量的回溯动作,直到匹配成功

19 9.4更强大的正则表达式 正则表达式的速度依赖于具体的数据。 贪婪量词与非贪婪量词的差别
I’am talking about the cartoon with Fred and <BOLD>Wilma</BOLD>! s#<BOLD>(.*)</BOLD>#$1#g; I thought you said Fred and <BOLD>Velma</BOLD>, not <BOLD>Wilma</BOLD> $#<BOLD>(.*?)</BOLD>#$1#g;

20 跨行的模式匹配-替换 在多行字符串中,也可以分别针对每一行进行替换。 /m
$filename = "ex9.txt"; if (!open FILE, $filename){ die "Can't open '$filename': $!"; } my $lines = join '', <FILE>; $lines =~ s/^/$filename: /gm; print $lines;

21 本章小结 掌握:替换;split; join 熟悉:列表上下文中的m//,非贪婪量词 了解:跨行替换

22 Thank You !


Download ppt "Perl 语言."

Similar presentations


Ads by Google