2011-09-21 4 views
0

J'utilise ActiveState Perl 5.12.4 sur Windows 7. Je suis en train d'exécuter une recherche et remplacer ...Perl: simple remplacement question

print "selected dir: $selected_dir basedir: $baseTestDir\n"; 
$selected_dir =~ s/$baseTestDir//g; 

$selected_dir = "\home\selenium\projects\myco\AutomatedTests\MyCliUSA\Critical Path\Live\G Sedan" et $baseTestDir = "\home\selenium\projects\myco\AutomatedTests\MyCliUSA". Cependant, après l'instruction de recherche et de remplacement, est inchangé. Comment puis-je correctement implémenter une recherche et remplacer ici?

+0

Vous n'avez pas indiqué comment vous allez utiliser le nom du répertoire. Si vous allez l'utiliser en Perl sans appeler un "shell" Windows, vous pouvez utiliser des barres obliques au lieu de barres obliques inverses. par exemple./home/selenium/projects ... – tadmc

+0

Des antislash simples dans une chaîne entre guillemets doubles, comme vous l'avez fait, signifient quelque chose que vous n'attendez pas. Activer les avertissements! Voir http://stackoverflow.com/questions/6788117/how-can-i-convert-backward-slashes-to-forward-slashes-in-perl pour plus de détails. – daxim

Répondre

4

Vous n'avez pas converti le texte en $baseTestDir en un motif de regex. Cela peut utiliser quotemeta.

my $base_test_dir_pat = quotemeta($base_test_dir); 
$selected_dir =~ s/^$base_test_dir_pat//; 

Il est également accessible via \Q..\E dans des chaînes entre guillemets et similaires.

$selected_dir =~ s/^\Q$base_test_dir\E//; 

Un \E de fuite peut être omise.

$selected_dir =~ s/^\Q$base_test_dir//; 
-2

Je voudrais écrire ce qui suit pour remplacer selected_dir avec baseTestDir:

$selected_dir =~ s/$selected_dir/$baseTestDir/; 
+0

Cela ne fait pas la même chose. Je veux supprimer $ baseTestDir de $ selected_dir. – Dave

-1

Vous devez échapper les '\' s.

Do

$baseTestDir =~ s/\\/\\\\/g;

avant le remplacement.

+2

'quotemeta' ou'/Q /.../ 'est une façon * beaucoup * plus propre et plus générale de faire cela. –