Как найти последний индекс строки в Perl - PullRequest
6 голосов
/ 18 ноября 2010

Я новичок в Perl-скриптинге. Может кто-нибудь сказать мне, как найти последнюю строку indexof подстроки в строке, которая повторяется несколько раз в строке.

На самом деле я хочу извлечь имя файла из заданного пути

 $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, '\\');
 }

Может кто-нибудь сказать мне способ сделать это эффективным способом.

Ответы [ 3 ]

14 голосов
/ 18 ноября 2010

Использование Файл :: Базовое имя :

#!/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};
11 голосов
/ 18 ноября 2010

Что касается вопроса в заголовке, вы можете использовать функцию rindex:

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

    Работает так же, как index, за исключением того, что возвращает позицию последнего вхождения SUBSTR в STR.Если задано POSITION, возвращает последнее вхождение, начинающееся с этой позиции или перед ней.

При этом лучше проанализировать пути к файлам с помощью File::Basename.

4 голосов
/ 18 ноября 2010

Может кто-нибудь сказать мне, как найти последний индекс подстроки s в строке, которая повторяется в строке несколько раз?

Да.

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";
}

Но примите ответ Синан, поскольку он ответил на то, что вы хотели знать, а не на то, что вы спрашивали. ☺

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...