2010-05-14 2 views
1

J'ai une chaîne qui a un chemin de fichier:Comment puis-je modifier le répertoire dans une chaîne Perl qui a un chemin de fichier?

$workingFile = '/var/tmp/A/B/filename.log.timestamps.etc'; 

Je souhaite modifier le chemin du répertoire, en utilisant deux variables à noter la vieille partie de chemin et la nouvelle portion de chemin:

$dir = '/var/tmp'; 
$newDir = '/users/asdf'; 

I souhaitez obtenir les éléments suivants:

'/users/asdf/A/B/filename.log.timestamps.etc' 

Répondre

4

Retirez le slash de $ nEWDIR et:

($foo = $workingFile) =~ s/^$dir/$newDir/; 
+1

Ça a l'air bien. Pour être complètement en sécurité, vous voudrez peut-être ajouter un début de ligne juste pour couvrir le cas lorsque $ dir = A/B – Greg

+0

barre oblique supprimé merci c'est ce que je suis après gars – wmitchell

+0

@Greg Harman: bon appel, ajouté^au début –

-2

J'ai récemment fait ce genre de chose.

$workingFile = '/var/tmp/A/B/filename.log.timestamps.etc'; 
$dir   = '/var/tmp'; 
$newDir  = '/users/asdf'; 

unless (index($workingFile, $dir)) { # i.e. index == 0 
    return $newDir . substr($workingFile, length($dir)); 
} 
0

sh-beta's answer est correcte dans la mesure où elle répond à manipuler des chaînes, mais en général il est préférable d'utiliser les bibliothèques disponibles pour manipuler les noms de fichiers et les chemins:

use strict; use warnings; 
use File::Spec::Functions qw(catfile splitdir); 

my $workingFile = '/var/tmp/A/B/filename.log.timestamps.etc'; 
my $dir = '/var/tmp'; 
my $newDir = '/usrs/asdf'; 

# remove $dir from $workingFile and keep the rest 
(my $keepDirs = $workingFile) =~ s#^\Q$dir\E##; 

# join the directory and file components together -- splitdir splits 
# into path components (removing all slashes); catfile joins them; 
#/or \ is used as appropriate for your operating system. 
my $newLocation = catfile(splitdir($newDir), splitdir($keepDirs)); 
print $newLocation; 
print "\n"; 

donne la sortie:

/usrs/asdf/tmp/filename.log.timestamps.etc 

File::Spec est distribué en tant que partie du noyau Perl. Sa documentation est disponible sur la ligne de commande avec perldoc File::Spec ou on CPAN here.

5

Il y a plusieurs façons de le faire. Avec le bon module, vous économisez beaucoup de code et vous rendez l'intention beaucoup plus claire.

use Path::Class qw(dir file); 

my $working_file = file('/var/tmp/A/B/filename.log.timestamps.etc'); 
my $dir   = dir('/var/tmp'); 
my $new_dir  = dir('/users/asdf'); 

$working_file->relative($dir)->absolute($new_dir)->stringify; 
# returns /users/asdf/A/B/filename.log.timestamps.etc 
+0

Pour quelque chose de plus grave qu'un script unique, c'est une meilleure réponse que la mienne. –

Questions connexes