2010-11-18 9 views
5

Je suis nouveau à l'écriture de scripts Perl. Quelqu'un peut-il me dire comment trouver la dernière indexof sous-chaîne dans une chaîne qui est répétée plusieurs fois dans la chaîne.comment trouver le dernier index de la chaîne en perl

actully Je veux extraire le nom du fichier à partir d'un chemin de donner

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

Si je peux trouver la dernière chaîne du « \ » I cand extraire le nom de fichier en utilisant la fonction substr. Je l'ai déjà fait de la manière suivante. Mais c'est inefficace.

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

Quelqu'un peut-il me dire un moyen de le faire de manière efficace.

+1

Vous devriez vraiment utiliser '"/"' comme séparateur de chemin, pas '" \\\\ "', car cela rend la lecture et l'écriture beaucoup plus difficiles. Et le noyau Micro $ oft s'en fout. – tchrist

+0

Au lieu de index(), utilisez rindex(): D – Jassi

Répondre

14

Utilisation 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: Vous pouvez faire cela avec des expressions régulières aussi, mais lorsqu'ils traitent avec des noms de fichiers, utiliser des fonctions spécialement conçues pour traiter les noms de fichiers. Pour être complet, voici un exemple d'utilisation d'une expression régulière pour capturer la dernière partie:

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

+1 pour la regex –

+1

+1 pour 'File :: Basename'. Une regex est fragile et non portable. –

+1

Depuis quand les noms de fichiers '\ w' sont-ils utilisés? Juste dans cet exemple, pas vrai? – tchrist

9

En ce qui concerne la question dans le titre, vous pouvez utiliser la fonction rindex:

  • rindex STR, SUBSTR, pOSITION
  • rindex STR, SUBSTR

    fonctionne comme index sauf qu'il retourne la position du dernier l'occurrence de SUBSTR dans STR. Si POSITION est spécifié, renvoie la dernière occurrence commençant à cette position ou avant.

Cela dit, il est préférable d'analyser les chemins de fichiers avec File::Basename.

4

Quelqu'un peut-il me dire comment trouver le dernier indice de sous-chaîne dans une chaîne qui est répétée plusieurs fois dans la chaîne?

Oui.

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

Mais prenez la réponse de Sinan, puisqu'il a répondu à ce que vous vouliez savoir, pas à ce que vous avez demandé. ☺

Questions connexes