Основной проблемой является ваше использование недействительных побегах:
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
).
Отсутствующие 'использовать строгие; использовать предупреждения; '. – melpomene
Подсказка: у вас двойная обратная косая черта в вашем вызове 'rindex', но на вашем пути только одна обратная косая черта. Зачем? – melpomene
@melpomene, строка придет, читая текстовый файл, и это формат im, получаемый из строк тестовых файлов ... –