Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 承认;“类型”;散列键的定义_Regex_Perl_Data Structures - Fatal编程技术网

Regex 承认;“类型”;散列键的定义

Regex 承认;“类型”;散列键的定义,regex,perl,data-structures,Regex,Perl,Data Structures,我想使用“编译正则表达式”(我的意思是:一个qr/./形式的表达式)作为散列结构的键 为了在遍历哈希键时区分常量字符串和这些正则表达式,我尝试使用ref(),或者is_regexp(),但前者返回空字符串,后者不起作用。恐怕我遗漏了Perl引用与标量之间的一些基本信息 除此之外,我的解决方案似乎有效。还是太难看了? 欢迎任何备选方案 需要了解的一些代码ref()函数: my $regex = qr/foo/; printf "ref(\$regex): %s \n", ref($regex);

我想使用“编译正则表达式”(我的意思是:一个
qr/./
形式的表达式)作为散列结构的键

为了在遍历哈希键时区分常量字符串和这些正则表达式,我尝试使用
ref()
,或者
is_regexp()
,但前者返回空字符串,后者不起作用。恐怕我遗漏了Perl引用与标量之间的一些基本信息

除此之外,我的解决方案似乎有效。还是太难看了? 欢迎任何备选方案

需要了解的一些代码
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 []

使用有什么问题吗?它使您不必重新发明轮子:)


正如Qtax在注释中所指出的,Perl散列键始终是字符串:如果使用字符串以外的内容作为散列键,则首先将其转换为字符串

你在另一篇评论中写道:


“我从配置文件中读取计数器定义;我希望能够支持某些模式语法,例如:McDouglas、McDonald、/Mc[a-Za-z]*/。然后我从文本文件中读取计数器值,并相应地更新相关计数器:McDonald 23 McIntosh 11”

如果我理解正确,一个简单的解决方案可能是将编译后的regexp存储在另一个散列中,并键入它们的字符串表示形式:

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";
}
my@patterns=(
“麦克杜格拉斯”,
“麦当劳”,
“Mc[A-Za-z]*”,
);
我的%regexps=map+($\u=>qr/^$\u$/),@patterns;
我的%计数器;
而(){
而(my($pat,$re)=每个%regexps){
$counters{$pat}++if/$re/;
}
}
foreach my$pat(@patterns){
打印“$pat:”,($counters{$pat}| | 0),“\n”;
}

散列中的键是字符串
ref
将始终返回
undef
。如果您使用任何不是字符串的键,它将转换为字符串。虽然您建议的包非常有趣,但它执行的操作与我需要的不同。在我的例子中,我还可以存储定义正则表达式的普通字符串(但我会丢失正则表达式预编译)。trwo接近冲突的一种情况是需要存储相互部分重叠的正则表达式。@AndreaG:请举例说明您的意思。我从配置文件中读取计数器定义;我希望能够支持一些模式语法,例如: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";
}