2010-11-18 10 views
5

Soy nuevo en scripting de perl. ¿Puede alguien decirme cómo encontrar el último índice de subcadena en una cadena que se repite varias veces en la cadena?cómo encontrar el último índice de cadena en perl

actully que desea extraer el nombre del archivo desde una ruta de dar

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

Si puedo encontrar la última cadena de la '\' Me cand extraer el nombre del archivo usando substr función. Ya lo hice de la siguiente manera. Pero es ineficiente.

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

¿Puede alguien decirme una manera de hacerlo de una manera eficiente.

+1

Realmente debería usar '"/"' como el separador de ruta, no '" \\\\ "', porque hace que sea mucho más difícil de leer y escribir. Y al kernel Micro $ oft no le importa. – tchrist

+0

En lugar de index() use rindex(): D – Jassi

Respuesta

14

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

NB: Puede hacer esto con expresiones regulares también, pero cuando se trata de nombres de archivo, funciones de uso específicamente diseñado para hacer frente a los nombres de archivo. Para completar, aquí es un ejemplo del uso de una expresión regular para capturar la última parte:

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

+1 para la expresión regular –

+1

+1 para 'File :: Basename'. Una expresión regular es frágil y no portátil. –

+1

¿Desde cuándo son los nombres de archivo '\ w' caracteres? Solo en ese ejemplo, ¿no? – tchrist

9

En cuanto a la pregunta del título, se puede utilizar la función rindex:

  • rindex STR, SUBSTR, pOSICIÓN
  • STR rindex, SUBSTR

    funciona igual que index excepto que devuelve la posición del último aparición de SUBSTR en STR. Si se especifica POSICIÓN, devuelve la última ocurrencia que comienza en o antes de esa posición.

Dicho esto, es mejor analizar las rutas de archivos con File::Basename.

4

Puede alguien decirme cómo encontrar el último índice de s subcadena en una cadena que se repite varias veces en la cadena?

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

Pero toma la respuesta de Sinan, ya que él respondió lo que querías saber, no lo que pediste. ☺

Cuestiones relacionadas