Двойная интерполяция регулярных выражений в Perl

В спецификации воспроизведения нет поля «name». Так что это неправильно:

- name: run playbook locally
  hosts: 127.0.0.1
  connection: local
  become: yes
  gather_facts: yes
  tasks:

Это должно выглядеть так:

- hosts: 127.0.0.1
  connection: local
  become: yes
  gather_facts: yes
  tasks:
7
задан tomdee 2 February 2010 в 09:37
поделиться

4 ответа

Используя оценку может помочь Вам здесь. Смотрите на следующий код, он может предварительно скомпилировать regexp, это готово использоваться последнее:

my $compiled_regexp;
my $regexp = '^\d+$stored_regexp$';
my $stored_regexp = 'a';

eval "\$compiled_regexp = qr/$regexp/;";
print "$compiled_regexp\n";

Оператор qr//может использоваться для предварительной компиляции regexp. Это позволяет Вам создать его, но еще не выполняет его. Можно сначала создать regexps с ним и затем использовать их последний.

3
ответ дан 6 December 2019 в 19:43
поделиться

Ваши переменные Perl не находятся в объеме в Вашем конфигурационном файле, и я думаю, что это - хорошая вещь. оценка страшна.

Вы были бы более обеспеченной реализацией Вашей собственной шаблонной обработки.

Таким образом в файле конфигурации:

regex = ^\d+__TEMPLATE_FIELD__$

В читателе файла конфигурации:

# something like this for every template field you need
$regex =~ s/__TEMPLATE_FIELD__/$stored_regex/g;

При использовании:

$lValid = ($valuetocheck =~ m/$regex/)

Переместите их в зависимости от в том, какую точку Вы хотите, чтобы шаблонная замена применила.

3
ответ дан 6 December 2019 в 19:43
поделиться

Можно определить regexp в конфигурационном файле как это:

regex = ^\d+(??{$stored_regex})$

Но необходимо будет отключить проверку защиты в блоке, где Вы используете regexp путем выполнения этого в программе Perl:

use re 'eval';
7
ответ дан 6 December 2019 в 19:43
поделиться

Проблема, связанная с этим: если вы делаете двойную интерполяцию в строке, а также имеете подстановочные строки в переменных, подумайте:

# the concat with doublequotes in the replacement string 
#  are to make them PART OF THE STRING, NOT THE STRING DELIMITERS,
#  in other words, so the 2nd interpolation sees a double quoted string :
#     eval eval $replace -> eval $1 hello world -> syntax error 
#     eval eval $replace -> eval "$1 hellow world"  -> works ok 
# see: http://www.perlmonks.org?node_id=687031  

if($line =~ s/$search/'"' . $replace . '"'/ee) {
     # STUFF... 
}
0
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: