2014-12-08 2 views
1

Возможно ли вообще динамически генерировать регулярное выражение, используя значения из массива в Perl?Скомпилировать динамическое регулярное выражение в perl

Допустим, у меня есть массив ключевых слов, которые я хочу совместить. Как я могу создать регулярное выражение из значений в этом массиве?

Следующая, кажется, не работает

### Generate regex dynamically 
my @regx_array = ('apples','oranges','bananas'); 
my $dynanic_regx = qr/join("|",@regx_array)/; 

Как я ищу следующее регулярное выражение:

(?^i:apples|oranges|bananas); 

Но вместо этого я в конечном итоге с

(?^i:join("|",ARRAY(0x34c5924))); 

Любые Помощь будет принята с благодарностью.

ответ

1
my @regx_array = ('apples','oranges','bananas'); 
my ($dynamic_regx) = map qr/$_/i, join "|", map quotemeta, @regx_array; 
+0

Спросите, требуется ли дополнительное объяснение. –

2

У вас есть пара вещей не так. Во-первых, вы неправильно создаете свой массив.

my @regx_array = ['apples','oranges','bananas']; 

Вы используете круглые скобки для создания списка.

my @regx_array = ('apples','oranges','bananas'); 

Тогда это сделать:

my $list = join('|', @regx_array); 
my $dynamic_regx = qr/$list/i; 
+0

Упс. Исправленный. –

+0

Разве это не закончилось бы совпадением на строке, содержащей «яблоки | апельсины | бананы», а не яблоки, апельсины или бананы? –

+0

Я стою исправлены. Работает отлично. Так просто. :) –

0

Даже проще, чем два других:

my @regx_array = qw(apples oranges bananas); 
local $" = '|'; 
my $regex  = qr/(@regx_array)/i; 

$" также известен как $LIST_SEPARATOR. И об этом значении:

Когда массив или срез массива интерполируется в строку с двумя кавычками ... ее элементы разделены этим значением. Значение по умолчанию - это пробел.