【问题标题】:Perl keywords parsingPerl关键字解析
【发布时间】:2013-12-02 12:15:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: regex perl keyword-search


    【解决方案1】:
    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)$/

      【讨论】:

        【解决方案3】:

        如果你真的想在这种任务中使用正则表达式,你应该在将它们连接到列表之前对每个关键字进行转义。在关键字的开头插入\Q,在关键字的末尾插入\E

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

        【讨论】:

        • 或:my $pattern = join('|', map quotemeta, @rejectionlist);
        • @tobyink - 是的,同样的东西,...但我的解决方案要快一点,而且读起来更好:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-17
        • 2012-08-28
        • 1970-01-01
        • 2014-07-19
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多