Логические AND, OR и NOT в одном шаблоне

Проблема

Имеется готовая программа, которой в качестве аргумента или входных данных передается шаблон. В нее невозможно включить дополнительную логику например, параметры для управления учетом регистра при поиске, AND и NOT. Следовательно, вы должны написать один шаблон, который будет совпадать с любым из двух разных шаблонов (OR), двумя шаблонами сразу (AND) или менят смысл поиска на противоположный (NOT).
Подобная задача часто возникает при получении данных из конфигурационных файлов, Web-форм или аргументов командной строки. Пусть у вас имеет программа, в которой присутствует следующий фрагмент:
chomp($pattern = <CONFIG_FH>);
if ( $data =~ /$pattern/ ) {...}
Если вы отвечаете за содержимое CONFIG_FH, вам понадобятся средства для передачи программе поиска логических условий через один-единственный шаблон.

Решение

Выражение истинно при совпадении /ALPHA/ или /BETA/ (аналогично /ALPHA/ || BETA/):
/ALPHA|BETA/
Выражение истинно, если и /ALPHA/, и /BETA/ совпадают при разрешенных перекрытиях (то есть когда подходит строка "BETALPHA"). Аналогично /ALPHA/ && /ВETA/:
/^(?=*ALPHA)(?=.*BETA)/s
Выражение истинно, если и /ALPHA/, и /BETA/ совпадают при запрещенных перекрытиях (то есть когда "BETALPHA" не подходит):
/ALPHA.*BETA|BETA.*ALPHA/s
Выражение истинно, если шаблон /PAT/ не совпадает (аналогично $var !~ /PAT/):
/^(?:(?!PAT).)*$/s
Выражение истинно, если шаблон BAD не совпадает, а шаблон GOOD — совпадает:
/(?=^(?:(?!BAD).)*$)GOOD/s

Комментарий

Предположим, вы пишете программу и хотите проверить некоторый шаблон на несовпадение. Воспользуйтесь одним из вариантов:
if (!($string =~ /pattern/)) { something() }  # Некрасиво
if ( $string !~ /pattern/) { something() }    # Рекомендуется
Если потребовалось убедиться в совпадении обоих шаблонов, примените следующую запись:
if ($string =~ /pat1/ && $string =~ /pat2/)  { something() }
Проверка совпадения хотя бы одного из двух шаблонов выполняется так:
if ($string =~ /pat1/ || $string =~ /pat2/ )  { something() }
Короче говоря, нормальные логические связки Perl позволяют комбинировать логические выражения вместо того, чтобы объединять их в одном шаблоне.

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: