Regexp :: Grammars中不区分大小写的哈希键

psg*_*els 5 regex perl regexp-grammars

在perl模块Regexp :: Grammars中,考虑以下标记:

<token: command>       <%commands>
Run Code Online (Sandbox Code Playgroud)

此标记是复杂语法的一部分,可解析各种不同的句子。

该令牌与哈希%commands中的任何单词匹配,我已定义如下(当然,在任何函数之外):

our %commands = (
    'Basic_import'  => 1,
    'Wait'          => 1,
    'Reload'        => 1,
    'Log'           => 1,
); 
Run Code Online (Sandbox Code Playgroud)

这适用于匹配“ Basic_import”,“ Wait”等关键字,但是,我也希望它与“ basic_import”,“ wait”等字匹配。

如何使此哈希大小写不敏感,而不必多次复制和粘贴每个关键字?因为这是复杂语法的一部分,所以我想使用Regexp :: Grammars,并且我不希望不必针对此特殊异常恢复为grep。

ike*_*ami 5

从文档,它听起来就像<%commands>将匹配WaitWaiting,所以即使是不区分大小写的版本<%commands>会不太理想。

通常,您要匹配通用标识符,并独立检查标识符是否为有效命令。这就是防止printfoo();等同print foo();于Perl的原因。

我可以提出以下建议:

use feature qw( fc );

our %commands = map { fc($_) => 1 } qw(
   Basic_import
   Wait
   Reload
   Log
); 

<rule: command> (<ident>) <require: (?{ $commands{fc($CAPTURE)} })>

<token: ident> \w+
Run Code Online (Sandbox Code Playgroud)

如果希望与5.16之前的Perl版本向后兼容lcfc则可以放弃使用而不是。


Thi*_*Not 2

您可以使用Hash::Case::Preserve使哈希查找不区分大小写:

use strict;
use warnings 'all';

use Data::Dump;
use Hash::Case::Preserve;
use Regexp::Grammars;

tie my %commands, 'Hash::Case::Preserve';

%commands = (
    'Basic_import'  => 1,
    'Wait'          => 1,
    'Reload'        => 1,
    'Log'           => 1,
);

my $grammar = qr{

    <command>

    <token: command>    <%commands>

};  

dd \%/ if 'basic_import' =~ $grammar;
Run Code Online (Sandbox Code Playgroud)

输出:

{ "" => "basic_import", "command" => "basic_import" }
Run Code Online (Sandbox Code Playgroud)

请注意,在向其中插入任何值之前,您必须先对其进行tie哈希处理。