1. 用index查找子字符串
查找给定的子字符串是否出现在某个字符串中,其实就是要找出它在字符串中的位置
my $where = index($big, $small);
perl会在长字符串中寻找短字符串首次出现的地方,并返回一个整数表示第一个字符的匹配位置,返回的字符位置是从0算起的
my $stuff = "Howdy world!";
my $where = index($stuff, "wor"); # $where会得到6
另一种理解位置的方法,就是把它当成走到子字符串之前要跳过的字符数
index函数每次都会返回首次出现子字符串的位置,可以加上可选的第三个参数来表示偏移量,来指定开始搜索的地方
my $stuff = "Howdy world!";
my $where1 = index($stuff, "w"); # $where1为2
my $where2 = index($stuff, "w", $where1 + 1); #$where2为6
my $where3 = index($stuff, "w", $where2 + 1); # $where3为-1(没找到!)
第3个参数相当于可能的最小返回值,如果子字符串无法在该位置或其后被找到,那么index就会返回-1
use v5.10;
my $stuff = "Howdy world!";
my @where = ();
my $where = -1;
while(1){
$where = index($stuff, 'w', $where + 1);
last if $where == -1;
push @where, $where;
}
say "Positions are @where";
有时候需要倒过来,搜索子字符串最后出现的位置,可以使用rindex函数,它会从字符串末尾的地方开始找起
my $last_slash = rindex("/etc/passwd","/"); # 返回值是4
rindex函数也有可选的第三个参数,不过它是用来限定返回的最大值
my $fred = "Yabba dabba doo!";
my $where1 = rindex($fred, "abba"); # $where1 为7
my $where2 = rindex($fred, "abba", $where1 - 1); # $where2 为1
my $where3 = rindex($fred, "abba", $where2 - 1); # $where3 为-1
use v5.10;
my $fred = "Yabba dabba doo!";
my @where = ();
while(1){
$where = rindex($fred, "abba", $where - 1)
last if $where == -1;
push @where, $where;
}
say "Positions are @where";
2. 用substr操作子字符串
my $part = substr($string, $initial_position, $length);
substr函数需要3个参数,1个原始字符串,1个从零算起的开始位置(类似index的返回值)以及子字符串长度
my $mineral = substr("Fred J. Flintstone", 8, 5); # 返回"Flint"
my $rock = substr "Fred J. Flintstone", 13, 1000; # 返回"stone"
substr的第3个参数是要提取的子字符串。如果位置偏后取不到那么长,那就有多少返回多少
省略第三个参数的话,就是说想一直取到字符串的结尾
my $pebble = substr "Fred J. Flintstone", 13; # 返回“stone”
一个较大的字符串中子字符串的起始位置可以为负值,表示从字符串结尾开始倒数(比如,位置-1就是最后一个字符)
my $out = substr("some very long string", -3, 2); # $out 为 “in”
index与substr可以紧密合作
my $long = "some very very long string";
my $right = substr($long, index($long, "l"));
my $string = "Hello, world!";
substr($string, 0, 5) = "Goodbye"; # $string 变为"Goodbye, world!"
用来取代的(子)字符串的长度并不一定要与被取代的子字符串的长度相同,字符串会自行调整长度
substr($string, 9, 0) = "cruel"; # $string 变为“Goodbye, cruel world!”
substr($string, -20) =~ s/fred/barney/g; # 只处理字符串的最后20个字符,将所有的fred替换成barney
substr和index能办到的事多半也能用正则表达式办到。不过substr和index通常会快一点,因为它们没有正则表达式引擎的额外负担:它们总是区分大小写,它们不必担心元字符,而且也不会动用任何内存变量
如果不想给substr函数赋值,可以使用第4个参数,第4个参数是替换子字符串
my $previous_value = substr($string, 0, 5, "Goodbye");