Как получить элементы хэша, ключи которых соответствуют заданному регулярному выражению? - PullRequest
2 голосов
/ 02 февраля 2011

Как получить элементы хеша, ключи которых соответствуют заданному регулярному выражению? без указания какого-либо модуля (например, Tie :: RegexpHash)

Как этого добиться?

%s = (
        'as2-queen' => 1 ,
        'as1-queen' => 2,
    );


my $regex = qr/queen/ ;

if ( $s{$regex}) {
  print " I am here " ;
}

~

Ответы [ 3 ]

15 голосов
/ 02 февраля 2011

Ваш вопрос не очень ясен, поскольку ваша проблема, вероятно, заключается не только в том, чтобы "использовать" регулярное выражение в качестве хеш-ключа, но и в том, что вы получите результат, который вы не объяснили.

Я полагаю, что ваш вопрос можно перефразировать как "Как получить элементы хэша, ключи которых соответствуют заданному регулярному выражению?" Если это так, то вам подойдет следующий код:

my $regex = qr/queen/;
print "$_ => $s{$_}\n" for grep $regex, keys %s;
1 голос
/ 02 февраля 2011

Использование интеллектуальное сопоставление в Perl 5.10.1 и выше:

use 5.010;
use strict;
use warnings;

my %s = (
        'as2-queen' => 1 ,
        'as1-queen' => 2,
    );


my $regex = qr/queen/ ;

if ($regex ~~ %s) {
    say "I am here" ;
}

# Or perhaps cleaner
if (%s ~~ $regex) {
    say "I am here" ;
}

# More or less equivalent, in pre-5.10 code
if (grep { /$regex/ } keys %s) {
    say "I am here" ;
}
1 голос
/ 02 февраля 2011

Я предполагаю, что вы пытаетесь сопоставить ключи в хэше, используя регулярное выражение.

Если это так, используйте grep в списке ключей:


%s = (
        'as2-queen' => 1 ,
        'as1-queen' => 2,
    );

my ($first_matching_key) = grep { $_ =~ /queen/ } keys %s;

print "First matching key is $first_matching key\n";
print "Corresponding value is $s{$first_matching_key}\n";

Это то, чтоВы имели в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...