%s = ( t2* => [ a,b,x],
IAm => 'ALL' ) ;
my $key = 't2000' ;
在上面的示例中,t2*
匹配$key
,但我无法检索相应的哈希值。
当密钥是正则表达式时,检索值的最佳方法是什么?
答案 0 :(得分:6)
听起来你想要Tie::RegexpHash,它允许你为一个正则表达式的哈希键赋值,然后通过传递与正则表达式匹配的任何键来检索值。来自文档的示例:
use Tie::RegexpHash;
my %hash;
tie %hash, 'Tie::RegexpHash';
$hash{ qr/^5(\s+|-)?gal(\.|lons?)?/i } = '5-GAL';
$hash{'5 gal'}; # returns "5-GAL"
$hash{'5GAL'}; # returns "5-GAL"
$hash{'5 gallon'}; # also returns "5-GAL"
答案 1 :(得分:1)
你需要清理这个问题。我认为你做错了什么,但我会尽力回答。
my %s = ( qr/t2*/ => [ qw/ a b x / ], IAm => 'ALL' );
my $key = 't2000';
my @matches = ();
while ( my ( $regex_key, $value ) = each( %s ) ) {
push @matches, $value if $key =~ $regex_key;
}
我不知道这是不是你想要的。它看起来很难看。
此外,如果您打算在哈希中插入正则表达式,请使用'qr'函数来包装表达式。
答案 2 :(得分:1)
请注意,以下实现依赖于以下假设:指定的密钥只能与哈希中的单个密钥匹配。
%s = (
t20* => [ a,b,x],
IAm => 'ALL'
) ;
my $value = 't2000';
my $result = value_pattern_hash ( \%s, $value );
sub value_pattern_hash {
my ( $hash, $key ) = @_;
foreach my $pattern ( keys %s ) {
next unless $key =~ /$pattern/; # NOTE: quotemeta would break this
return $hash->{$pattern};
}
return; # In case of a failed match, returns undef or empty list
}
如果希望返回多个匹配项,那么简单的map
/ grep
组合就能解决问题:
my @results = map { $s{$_} } grep { $value =~ /$_/ } keys %s;