如何使用我的哈希键作为正则表达式来检索值?

时间:2011-07-27 16:15:52

标签: perl

%s = (  t2* => [ a,b,x],
        IAm => 'ALL' ) ;

my $key = 't2000' ;

在上面的示例中,t2*匹配$key,但我无法检索相应的哈希值。

当密钥是正则表达式时,检索值的最佳方法是什么?

3 个答案:

答案 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;