1

我目前正在用 perl 编写一个脚本来解析 perl 模块并从中获取有意义的单词。(除了 perl 关键字)。

我有一个包含 perl 关键字的拒绝列表数组。我使用它来将有意义的单词与 perl 关键字分开。

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

是否可以动态生成 perl 关键字(拒绝列表数组 - 通过使用任何例程)?

4

3 回答 3

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

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

my @meaningfulwords = grep { !exists $kw{ fc($_) } } @words;
于 2013-12-02T12:27:13.987 回答
2

我建议你看看这个B::Keywords模块。它将所有保留的 Perl 标识符分为十个不同的类别,并导出十个相应的名称数组,您可以根据需要使用它们。

顺便说一句,您的正则表达式是错误的。你想要/^(?:$pattern)$/

于 2013-12-02T12:38:10.943 回答
0

如果你真的想使用正则表达式来完成这种任务,你应该在将它们加入列表之前转义每个关键字。\Q在关键字的开头和关键字\E的末尾插入。

my $pattern = '(?:\Q' . join('\E|\Q', @rejectionlist) . '\E)';
于 2013-12-02T14:21:48.913 回答