1. s///g 全局替换
s/\s+/ /g 将字符串中所有的不规则空格都按空格输出
s/^\s+|\s+$//g 去掉字符串开头和结尾的空格
2. s///sixg
i忽略大小写,s表示模式为数字,x表示忽略模式中的空格
3. 同样支持绑定操作符: =~
4. 大小写转换:
$_ = "I saw Barney with Fred";
s/(fred|barney)/\U$1/gi # "I saw BARNEY with FRED" \U表示紧接着的都大写
s/(fred)|barney/\L$1/gi # "I saw barney with fred" \L表示紧接着的都小写
s/(\w+) with (\w+)/\U$2\E with $1/i # "I saw FRED with barney" \E表示大小写到此结束
s/(fred|barney)/\u$1/ig # "I saw FRED with Barney" \u表示紧跟着的一个字母大写
s/(fred|barney)/\u\L$1/ig # "I saw Fred with Barney" \u\L连着写表示第一个字母大写,后面小写
$_ = "Hello there, neighbor!";
my($first, $second, $third) = /(\S+) (\S+),(\S+)/ 默认找$_匹配
print "$second is my $third\n";
my $text = "Fred dropped a 5 ton granite block on Mr.Sal";
my @words = ($text =~ /([a-z]+)/ig);
print "Result: $words\n";
my %last_name = ($data =~ /(\w+)\S+(\w+)/g);
#! /usr/bin/perl -w use strict; chomp(my $date = 'date'); $^I = ".bak"; while(<>){ s/^Author:.*/Author:Randal/; s/^Phone:.*\n//; s/^Date:.*/Date:$date/; print; }由<>所得到的文件列表来源于命令行,主循环读入,更新,输出每一行--这里只是输出,但不会修改文件本身。但这并不是我们所期望的,我们期望的是还能写回文件/或者这么说希望的是修改文件。如何才能写回文件呢? $^I 当我们定义了$^I,<>会变得有些特殊。<>神奇的特点:如果没有指定文件名,则 从标准输入流中自动打开和关闭一系列的文件进行读入。但如果定义了$^I,那么$^I所定义的字符串会成为备份文件的扩展名.
同样的功能可以直接使用perl命令执行
$perl -p -i.bak -w -e 's/Randall/Randal/g' fred*.dat
非匹配括号: ?:
默认情况下 在匹配或者替换时,模式中被()引用的值会自动赋给$1,$2等变量,使用非匹配括号就可以避免这样的问题:
$str = "tangjiajia";
if($str =~ /(?:tang)jia(?:jia)/){ print $1, $2; } //会有warning说$1$2没有被定义
练习9.1写一个模式,它能匹配$what 当前的内容的 3 份连续拷贝。也就是说,如果$what 为 fred,则此模式能匹配 fredfredfred。如果$what 为 fred|barney,则此模式能匹配 fredfredbarney, barneyfredfred, barneybarneybarney,或者其它的变种。(提示:你应当在程序的顶端设置$what 的值,如 my $what = ‘
fred|barney’;)
#! /usr/bin/perl -w $what = 'fred|tee'; while($_ = shift @ARGV){ if(/($what){3}/){ print $_; } }