识别哈希键的"类型"

And*_*eaG 5 regex perl data-structures

我想使用"编译的正则表达式"(我的意思是:表单中的表达式qr/../)作为哈希结构的键.

为了在迭代哈希键时识别常量字符串和这些正则表达式,我试图使用ref(),或者is_regexp(),但前者返回空字符串,后者不起作用.我担心我会遗漏一些关于Perl refs和scalars的基本信息.

除此之外,我的解决方案似乎有效.反正太难看了吗?欢迎任何替代提案.

一些代码来理解ref()功能:

my $regex = qr/foo/;
printf "ref(\$regex): %s \n", ref($regex);
printf "is_regexp(\$regex): %d \n", is_regexp($regex);
# ref($regex): Regexp
# is_regexp($regex): 1

my $scalar = 3;
printf "ref(\$scalar): [%s] \n", ref($scalar);
# ref($scalar): []

my %my_hash = ('name', 'Becky', 'age', 23);
for my $k (keys %my_hash) {
    printf "%s [%s] -> %s [%s] \n", $k, ref($k), $my_hash{$k}, ref($my_hash{$k});
}
# name [] -> Becky []
# age [] -> 23 []
Run Code Online (Sandbox Code Playgroud)

Ilm*_*nen 7

正如Qtax在评论中指出的那样,Perl哈希键总是字符串:如果你使用字符串以外的东西作为哈希键,它首先被转换为字符串.

在另一条评论中你写道:

"我从配置文件中读取计数器定义;我希望能够支持一些模式语法,例如:McDouglas,McDonald,/ Mc [A-Za-z]*/.然后我从文本文件中读取计数器值,并且我相应地更新了相关的反制品:McDonald 23 McIntosh 11"

如果我理解这一点,一个简单的解决方案可能是将已编译的正则表达式存储在另一个哈希中,键入其字符串表示:

my @patterns = (
    'McDouglas',
    'McDonald',
    'Mc[A-Za-z]*',
);

my %regexps = map +($_ => qr/^$_$/), @patterns;
my %counters;

while (<>) {
    while (my ($pat, $re) = each %regexps) {
        $counters{$pat}++  if /$re/;
    }
}

foreach my $pat (@patterns) {
    print "$pat: ", ($counters{$pat} || 0), "\n";
}
Run Code Online (Sandbox Code Playgroud)