2015-10-11 3 views
0

Я хочу раздеть путь из файла строку, как это:Perl: найти последнее вхождение полукокса «»

Root\ToOrganization\Service_b37189b3-8505-4395_Out_BackOffice.xml 

Я пытаюсь найти индекс последнего вхождения «\» поэтому я могу использовать подстроку там.

но я не могу использовать символ «\» в поиске. Я использую "\" вместо этого, но не работает ...

мой код я пытаюсь:

$file = "Root\ToOrganization\Service_b37189b3-8505-4395_Out_BackOffice.xml"; 
$tmp = rindex($file, "\\"); 
print $tmp; 

Выходной сигнал я получаю:

-1 

Что я могу сделать ?

+1

Отсутствующие 'использовать строгие; использовать предупреждения; '. – melpomene

+1

Подсказка: у вас двойная обратная косая черта в вашем вызове 'rindex', но на вашем пути только одна обратная косая черта. Зачем? – melpomene

+0

@melpomene, строка придет, читая текстовый файл, и это формат im, получаемый из строк тестовых файлов ... –

ответ

5

Основной проблемой является ваше использование недействительных побегах:

use warnings; 
print "Root\ToOrganization\Service_b37189b3-8505-4395_Out_BackOffice.xml"; 
Unrecognized escape \T passed through at ... line 2. 
Unrecognized escape \S passed through at ... line 2. 
RootToOrganizationService_b37189b3-8505-4395_Out_BackOffice.xml 

Так что ваша $file переменная не содержит то, что вы думаете, что он делает.

Ваш rindex сам вызов хорошо, но вы можете просто сделать это (если вы находитесь на системе Windows):

use strict; 
use warnings; 
use File::Basename; 

my $path = "Root\\ToOrganization\\Service_b37189b3-8505-4395_Out_BackOffice.xml"; 
my $dir = dirname($path); 
print "dir = $dir\n"; 

Или (это должно работать на любой системе):

use strict; 
use warnings; 
use File::Spec::Win32; 

my $path = "Root\\ToOrganization\\Service_b37189b3-8505-4395_Out_BackOffice.xml"; 
my $dir = (File::Spec::Win32->splitpath($path))[1]; 
print "dir = $dir\n"; 

Обратите внимание, что если это действительно реальный путь к окну, то указанный выше код будет лишать букву диска (это первый элемент списка, возвращаемый splitpath).

+0

Это отличный ответ, единственная проблема в том, что ваш код возвращает имя файла, и мне нужна структура каталогов без имени файла :) –

+0

@DavidGidony Обновлено. – melpomene

0

двойные кавычки интерполировать ускользает \ T и \ S, так что вы должны использовать одиночные кавычки ' или Q // для тестирования. Во всяком случае, чтение из файла (например, с <>) будет работать для вас без каких-либо изменений в переиндексации связанных с кодом, то это работает отлично:

warn rindex ($_, "\\") while (<>); 
Смежные вопросы