2016-12-09 6 views
1

Я пытаюсь искать шаблон в файлах и выполнять операцию, если шаблон найден. Образец - class <class_name> extends. Но я хочу исключить случай, когда я сталкиваюсь с шаблоном //class <class_name> extends. Т.е. я хочу пропустить операцию, когда получаю прокомментированные строки.perl script/regex, чтобы избежать определенного шаблона

open my $fh, "<", $file_t or die "can't read open '$file_t': $OS_ERROR";  # Opening the file 
while (<$fh>) { 

    if(/class\s{1,10}<class_name>\s{1,10}extends/){ 
     #Perform the operation if we find above pattern 
    } 
close $fh or die "can't read close '$file_t': $OS_ERROR";      #Closing the file 
} 

Как включить фрагмент кода, чтобы исключить шаблон, о котором я упоминал. Спасибо за помощь.

*********** ************ редактирует

Я думаю, что придется заново сформулировать свой вопрос. Я также хочу убедиться, что когда я ищу class <class_name> extends, я должен искать только этот шаблон, а не если этот шаблон существует вместе с // перед ним. Что-то вроде, делая «если и только если» этот конкретный шаблон существует без какой-либо другой комбинации символов.

+0

Вы пытаетесь включить это в Regex выражения? Если нет, то отдельное Regex с или должно работать нормально. –

+0

@KRichardson: отдельное Regex не будет говорить, если '//' находится до или после цели. –

+0

@Richardson, В отдельном регулярном выражении, я пытаюсь, я не могу понять, как включить '//', поскольку он интерпретирует его по-другому. –

ответ

2

Одним из решений является только разрешить пробелы перед определением (если классы могут объявлены в отступом областях)

/^\s*class\s+<class_name>\s+extends/ 

Объяснение

^ Start of line 
\s* 0 or more whitespace characters 
+0

Одной из проблем может быть модификатор 'public' (или аналогичный) –

+0

@ Andy Ray Да, это решение работает тоже. Хорошая идея и спасибо. @K Ричардсон Я не уверен с модификатором. –

+0

Если ключевые слова могут предшествовать, вы можете использовать '/^[\ w \ s] * \ bclass ... /' – ikegami

2

Если вам необходимо включить проверку в том же Regex выражения (а не связывая их вместе с and, вы могли бы использовать отрицательный предпросмотр:

if (m{/^(?:(?!//).)*class\s{1,10}$className\s{1,10}extends}) { 
+0

Да, это работает. Спасибо за помощь. –

+1

Почему '\ s {1,10}' пробелы? Почему бы не использовать '\ s +'? –

+0

Я оставил это из кода, предоставленного OP, но да, я согласен. Если вы хотите отредактировать ответ, я с радостью принимаю его. –

0

Я думаю, я нашел решение с помощью выше . комментарии я включил ниже строку кода в моем коде: if(/^\s*\/\/class\s{1,10}<class_name>\s{1,10}extends/){next;}

новый кусок кода выглядит следующим образом:

open my $fh, "<", $file_t or die "can't read open '$file_t': $OS_ERROR";  # Opening the file 
while (<$fh>) { 
if(/^\s*\/\/class\s{1,10}<class_name>\s{1,10}extends/){next;} 
elsif(/class\s{1,10}<class_name>\s{1,10}extends/){ 
    #Perform the operation if we find above pattern 
} 
close $fh or die "can't read close '$file_t': $OS_ERROR";      #Closing the file 
} 

Спасибо за помощь.

+0

Это должно быть сделано. Я нашел способ, который может быть полезен в будущем, используя «негативный взгляд». –

+0

Да, ваше решение является четким и полезным. Спасибо. –

Смежные вопросы