如何在Perl中查找字符串的最后一个索引

8

我是perl脚本语言的新手。有人可以告诉我如何在字符串中查找多次重复的子字符串的最后一个索引。

实际上,我想从给定路径中提取文件名。

 $outFile = "C:\\AOTITS\\BackOffice\\CSVFiles\\test.txt";

如果我能找到 '\' 的最后一个字符串,我可以使用 substr 函数提取文件名。我已经以以下方式完成了这个操作。但是它效率低下。

$fragment =  $outFile ;
$count = index($fragment, "\\");
while($count > -1) {
    $fragment =  substr ($fragment, index($fragment, '\\')+1);
    $count = index($fragment, '\\');
 }

有人能告诉我一种高效的方法来做到这一点吗?


1
你应该使用"/"作为路径分隔符,而不是"\\\\",因为这样会使读写变得更加困难。而且微软内核并不在意。 - tchrist
使用rindex()而不是index() :D - Jassi
3个回答

15

使用File::Basename

#!/usr/bin/env perl
use strict; use warnings;

use File::Basename;

my $outFile = "C:\\AOTITS\\BackOffice\\CSVFiles\\test.txt";

my ($name) = fileparse $outFile;
print $name, "\n";

注意:您也可以使用正则表达式来实现,但是在处理文件名时,请使用专门设计用于处理文件名的函数。为了完整起见,这里提供使用正则表达式捕获最后一部分的示例:

my ($name) = $outFile =~ m{\\(\w+\.\w{3})\z};

1
+1 for File::Basename。正则表达式脆弱且不可移植。 - Alex Reynolds
1
文件名使用\w字符是从什么时候开始的?只是在那个例子中,不是普遍情况吧? - tchrist
@tchrist:当然,通常不是这样的。我并不想在正则表达式上花费太多精力,所以只是给出了一个在这种情况下有效的示例。只有一个单独的“-”会搞乱一切。 - Sinan Ünür
2
@Sinan:是的,我最近一直在超额完成正则表达式。这是因为我正在更新《Perl编程》第四版中的正则表达式章节,所以最近都在我的脑海中。 - tchrist
@thcrist 我恐怕过度成就只是一个轻描淡写的说法。;-) - Sinan Ünür

13

对于标题中的问题,你可以使用 rindex 函数:

  • rindex STR, SUBSTR, POSITION
  • rindex STR, SUBSTR

    index 函数类似,不同之处在于它返回 SUBSTR 在 STR 中最后一次出现的位置。如果指定了 POSITION,则返回最后一次出现在该位置或之前的 SUBSTR。

话虽如此,最好使用 File::Basename 来解析文件路径。


4
可以有人告诉我如何在字符串中查找子字符串的最后一个索引,该子字符串在字符串中重复多次?
可以。
my $whole = "Can someone tell me how to find the last index of s substring in a string which is repeated several times in the string?";
my $piece = "string";

my $place;
if ($whole =~ m { .* \Q$piece\E }gsx) {
    $place = pos($whole) - length($piece);
    print "Last found it at position $place\n";
} else {
    print "Couldn't find it\n";
}

但是请看Sinan的回答,因为他回答了你想知道的内容而不是你所问的内容。☺

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接