2013-12-02 2 views
1

В настоящее время я пишу скрипт в perl для анализа модулей perl и извлечения из них значимых слов. (кроме ключевых слов perl).Perl синтаксический анализ

У меня есть массив списков отказов, который содержит ключевые слова perl. Я использую это, чтобы отделить значимые слова от ключевых слов perl.

my $pattern = join("|", @rejectionlist); 
foreach my $word (@words) { 
    if (!($word =~ /^$pattern$/i)) { 
      push @meaningfulwords, $word; 
    } 
} 

Возможно ли динамически генерировать ключевые слова perl (массив списка отклонения - с помощью любых подпрограмм)?

ответ

4
use B::Keywords qw(@Symbols @Barewords); 

my %kw; 
@kw{(map fc, @Symbols, @Barewords)} =(); 

my @meaningfulwords = grep { !exists $kw{ fc($_) } } @words; 
2

Я предлагаю вам взглянуть на B::Keywords модуля. Он классифицирует все зарезервированные идентификаторы Perl в десяти разных категориях и экспортирует десять соответствующих массивов имен, которые вы можете использовать по своему усмотрению.

Кстати, ваше регулярное выражение неверно. Вместо этого вы хотите /^(?:$pattern)$/.

0

Если вы действительно хотите использовать регулярное выражение для этой задачи, вы должны избегать каждого ключевого слова, прежде чем объединять их в список. Вставьте \Q в начале ключевого слова и \E в конце ключевого слова.

my $pattern = '(?:\Q' . join('\E|\Q', @rejectionlist) . '\E)'; 
+1

Или: 'мой $ шаблон = присоединиться ('|', карта QuoteMeta, @rejectionlist);' – tobyink

+0

@tobyink - Да, тот же самый материал, ... но мое решение немного быстрее и Бетер читает :) –