Perl-字符串与排序1

本文探讨了Perl和Python中查找子字符串的方法,如index与rindex函数的应用,以及substr函数提取子串的技巧。通过实例展示如何使用这些工具处理字符串,包括偏移量和负索引。同时介绍了如何结合index与substr进行高效操作,以及正则表达式的对比。
摘要由CSDN通过智能技术生成

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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值