ZetCode

Perl rindex 函数

最后修改于 2025 年 4 月 4 日

Perl 的 rindex 函数从字符串的末尾开始搜索子字符串。它返回最后一次出现的位置,如果未找到则返回 -1。

rindex 类似于 index,但它是从右向左搜索。它对于查找文件扩展名、解析路径或处理来自末尾的数据非常有用。

基本 rindex 用法

rindex 最简单的形式接受一个字符串和一个子字符串。

basic.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "Hello world, hello Perl";
my $pos = rindex($text, "hello");

print "Last 'hello' found at position: $pos\n";

这会在字符串中查找 "hello" 的最后一次出现。位置从字符串的开头开始,从 0 算起。

$ ./basic.pl
Last 'hello' found at position: 13

查找文件扩展名

rindex 非常适合通过查找最后一个点来定位文件扩展名。

extension.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $filename = "document.backup.txt";
my $dot_pos = rindex($filename, ".");

if ($dot_pos != -1) {
    my $ext = substr($filename, $dot_pos + 1);
    print "File extension: $ext\n";
} else {
    print "No extension found\n";
}

我们使用 rindex 查找最后一个点,然后使用 substr 提取扩展名。这可以正确处理多个点。

$ ./extension.pl
File extension: txt

带位置限制的搜索

rindex 可以搜索到从开头指定的位置。

limit.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "abcXdefXghiXjkl";
my $pos = rindex($text, "X", 8);

print "Last 'X' before position 8: $pos\n";

这会查找出现在位置 8 或更早位置的最后一个 "X"。搜索从位置 8 开始,向左移动。

$ ./limit.pl
Last 'X' before position 8: 6

处理路径组件

rindex 有助于从完整文件名中提取目录路径。

path.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $path = "/home/user/docs/file.txt";
my $last_slash = rindex($path, "/");

if ($last_slash != -1) {
    my $dir = substr($path, 0, $last_slash);
    my $file = substr($path, $last_slash + 1);
    print "Directory: $dir\n";
    print "Filename: $file\n";
}

我们找到最后一个斜杠来分隔目录和文件名组件。此技术适用于 Unix 和 Windows 路径。

$ ./path.pl
Directory: /home/user/docs
Filename: file.txt

不区分大小写的搜索

rindexlc 结合使用以进行不区分大小写的搜索。

case.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "Hello World, hello Perl";
my $lc_text = lc($text);
my $pos = rindex($lc_text, "hello");

print "Last 'hello' (case-insensitive) at: $pos\n";
print "Original substring: ", substr($text, $pos, 5), "\n";

我们首先将字符串转换为小写,然后进行搜索。该位置与原始字符串的大小写匹配。

$ ./case.pl
Last 'hello' (case-insensitive) at: 13
Original substring: hello

查找多个出现

在循环中使用 rindex 从末尾查找所有出现。

multiple.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "abXcdXefXghXij";
my $sub = "X";
my $pos = length($text);

while (($pos = rindex($text, $sub, $pos - 1)) != -1) {
    print "Found '$sub' at position $pos\n";
    last if $pos == 0;  # Prevent infinite loop
}

我们从末尾开始,在每次迭代中向左移动。当找不到更多匹配项时,循环停止。

$ ./multiple.pl
Found 'X' at position 9
Found 'X' at position 6
Found 'X' at position 3
Found 'X' at position 1

比较 rindex 和 index

演示 rindexindex 之间的区别。

compare.pl
#!/usr/bin/perl

use strict;
use warnings;
use v5.34.0;

my $text = "apple,banana,apple,cherry";
my $sub = "apple";

my $first_pos = index($text, $sub);
my $last_pos = rindex($text, $sub);

print "First '$sub' at: $first_pos\n";
print "Last '$sub' at: $last_pos\n";

index 从左侧查找第一次出现,而 rindex 从右侧查找最后一次出现。

$ ./compare.pl
First 'apple' at: 0
Last 'apple' at: 13

最佳实践

来源

Perl rindex 文档

本教程介绍了 Perl 的 rindex 函数,并通过实际示例演示了其在常见场景中的用法。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Perl 教程