У меня есть регулярное выражение для проверки того, содержит ли ячейка CSV правильный путь к файлу:
EDIT В CSV перечислены пути к файлам, которые еще не существуют при запуске скрипта (я не могу использовать -e), а путь к файлу может включать * или %variable% или {$variable}.
my $FILENAME_REGEXP = '^(|"|""")(?:[a-zA-Z]:[\\\/])?[\\\/]{0,2}(?:(?:[\w\s\.\*-]+|\{\$\w+}|%\w+%)[\\\/]{0,2})*\1$';
Так как ячейки CSV иногда содержат обертки из двойных кавычек, а иногда и само имя файла нужно заключать в двойные кавычки, я сделал такую группировку (|"|""")...\1
Затем с помощью этой функции:
sub ValidateUNCPath{
my $input = shift;
if ($input !~ /$FILENAME_REGEXP/){
return;
}
else{
return "This is a Valid File Path.";
}
}
Я пытаюсь проверить, соответствует ли эта фраза моему регулярному выражению (она не должна совпадать):
"""c:\my\dir\lord"
но мой дорогой Perl попадает в бесконечный цикл, когда:
ValidateUNCPath('"""c:\my\dir\lord"');
EDIT на самом деле он зацикливается на этом:
ValidateUNCPath('"""\aaaaaaaaa\bbbbbbb\ccccccc\Netwxn00.map"');
Я убедился в http://regexpal.com, что мое регулярное выражение правильно улавливает эти несимметричные """ ... " заворачивая в двойные кавычки, но у Перла свое мнение :(
Я даже пробовал использовать флаги /g и /o в
/$FILENAME_REGEXP/go
но все равно висит. Что мне не хватает?
if (...) return; else return;
вызовет синтаксическую ошибку в perl... почему бы вам не вставить свой настоящий код, включая используемый вами цикл, тогда мы сможем вам помочь. - person TLP   schedule 10.05.2012Text::CSV
для захвата полей в каждой строке, а затем проверить путь к файлу с помощью-e
? - person   schedule 10.05.2012+
избавиться от квантификатора+
. - person   schedule 11.05.2012local::lib
. - person   schedule 20.05.2012