#!/usr/bin/perl
my $stuff = "Hello, world world";
my $where = index($stuff,"wor"); # $where=7,因为H的索引为0,所以world中w的索引值为7
my $where1 = index($stuff,"wor",$where+1); # $where=7,因为索引的起始位置是8,所以第二个world中w的索引值为13
my $where2 = index($stuff,"wor",$where1+1); # $where=14,未找到匹配字符串,返回 -1
# 循环查找
my $stuff = "Hello, world world";
my @where = ();
my $where = -1;
while (1) {
$where = index($stuff,"wor",$where+1);
last if $where == -1;
push @where,$where;
}
say "Positions are @where";
#!/usr/bin/perl
my $stuff = "yabba dabba doo";
my $where = rindex($stuff,"abba"); # $where=7,
my $where1 = rindex($stuff,"abba",$where-1); # $where=1,因为索引的起始位置是6,向前匹配
my $where2 = rindex($stuff,"abba",$where1-1); # $where=-1,起始查找位置为0,未找到匹配字符串,返回 -1
# 循环查找
my $stuff = "yabba dabba doo";
my @where = ();
my $where = length $stuff; # 通过length函数返回
while (1) {
$where = index($stuff,"abba",$where-1);
last if $where == -1;
push @where,$where;
}
say "Positions are @where";
#!/usr/bin/perl
my $stuff = "yabba dabba doo";
my $sub = substr($stuff,3,2); # $sub="ba"
my $sub = substr($stuff,7); #取回从7开始的所有字符串 $sub="abba doo"
my $sub = substr($stuff,-3,2); # $sub="do"
my $sub = substr($stuff,-5); #取回从-5开始的所有字符串 $sub="a doo"
my $sub = substr($stuff,index($stuff,"o")); #和index的联合使用,取回从字符“o”开始的所有字符,$sub="oo"
#!/usr/bin/perl
my $stuff = "yabba dabba doo";
substr($stuff,0,5) = "Goodbye"; # $stuff="Goodbye dabba doo",移除从0开始的5个字符,并插入新的字符串
substr($stuff,8,0) = "abc "; #第三个参数为零,不移除任何内容只插入,$stuff="Goodbye abc dabba doo"
substr($stuff,-15) =~ s/abc/xyz/; #只处理最后的20个字符,$stuff="Goodbye xyz dabba doo"
#使用传统的四个参数方法调用
substr($stuff,0,5,"Goodbye"); # $stuff="Goodbyeye xyz dabba doo",移除从0开始的5个字符,并插入新的字符串
#!/usr/bin/perl
my $data_tag = sprintf
"%4d/%02d/%02d %2d:%02d:%02d",
$yr,$mon,$day,$h,$min,$sec; #可能得到:2018/01/19 3:00:08 这种类似的结果
my $money = 123456789.0456;
my $mon = sprintf "%.2f",$money; #$mon = 123456789.05, 进行数字处理
Perl 允许用户创建自定义的排序规则子程序,用于解释具体的排序规则;
Perl 知道如何进行列表的排序,依次比较列表中的两个数字,然后按照顺序排列,Perl已经帮我们做好了这些,我们只需要告诉Perl如何比较两个数字即可,Perl会帮助我们完成其他的处理。
#!/usr/bin/perl
sub any_sort { # 实际上这么写不能正确工作,这里只是为了方便说明问题
my ($a,$b) = @_; # 声明两个变量并给他们赋值
#进行$a $b的比较
...
}
也许声明一次 $a,$b并赋值不会耗费多少时间,但是当子程序被调用成千上万次的话,这些时间将会严重影响程序的处理速度。因此我们不需要这么做,Perl已经为我们做好了,$a 和 $b将会是来自原始列表的元素,没有对他们进行声明和赋值,他们不过是列表中的原始元素在子程序中的别名而已,因此对$a和$b的操作是会改变原始列表中的值的,因此这里应该十分注意,尽量不要修改这两个变量的值。
#!/usr/bin/perl
sub by_number {
if ($a<$b) {-1} elsif ($b>$a) {1} else {0} #我们不需要声明$a和$b,我们只需要之处他们的比较规则
}
#排序子程序的调用
my @results = sort by_number @some_number;
现在我们可以使用 <=> 进行排序了:
#!/usr/bin/perl
my @results = sort {$a <=> $b} @some_number; #使用花括号将$a $b的比较规则括起来
my @results = reverse sort {$a <=> $b} @some_number; #使用reverse进行倒序排序
my @results = sort {$b <=> $a} @some_number; #不适用reverse进行倒序排序
第三行排序语法中,我们将$a 和 $b 对换位置,就可以实现倒序排序,因为<=>和cmp时段是的,他们并不知道那个是a哪个是b,只知道左右,所以我们如果把$a和$b对调,比较操作就会得到相反的结果。
#!/usr/bin/perl
my %score = (
"barney" => 87,
"fred" => 96,
"dino" => 78,
);
my @winner = sort by_score keys %score; #采用by_score的机制进行排序,对得到的keys按照其value进行排序
sub by_score { $score{$b} <=> $score{$a}} #不适用$a和$b,改为使用其对应的哈希值进行比较,a和b交换位置,表示数字较大的排在前面,降序排列
print @winner\n; #结果:fred barney dino
#!/usr/bin/perl
# 两级排序
my %score = (
"barney" => 87,
"fred" => 96,
"dino" => 78,
"aock" => 78,
);
my @winner = sort by_score_and_name keys %score; #采用by_score的机制进行排序,对得到的keys按照其value进行排序
sub by_score_and_name {
$score{$b} <=> $score{$a} #先按照分数进行排列
or
$a cmp $b #如果分数相同,按照名称进行排序
}
print @winner\n; #结果:fred barney aock dino
#!/usr/bin/perl
@patron_IDs = sort {
$fines{$b} <=> $fines{$a} or #数字标量使用 <=> ,降序排列
$number{$b} <=> $number{$a} or
$family{$b} cmp $family{$a} or #字符串标量使用 cmp,降序排列
$person{$b} cmp $person{$a} or
$a <=> $b; #ID按照升序排列
} @partron_ID