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。
从文档,它听起来就像<%commands>
将匹配Wait
的Waiting
,所以即使是不区分大小写的版本<%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版本向后兼容lc
,fc
则可以放弃使用而不是。
您可以使用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
哈希处理。