2011-02-02 3 views
2

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

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

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


my $regex = qr/queen/ ; 

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

~

+2

Вы должны показать свой ожидаемый результат. Если вы хотите эмулировать поведение Tie :: RegexpHash, посмотрите на его исходный код. – toolic

ответ

14

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

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

my $regex = qr/queen/; 
print "$_ => $s{$_}\n" for grep $regex, keys %s; 
1

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

Если да, то использовать 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"; 

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

+0

Вы попробовали свое решение? '$ first_matching_key' содержит количество ключей, которые соответствуют'/queen/' – Toto

+0

@ M42 d'oh, хороший улов, спасибо. –

+0

Было бы проще написать: 'grep {/ queen /} ключи% s'. – tchrist

1

Использование smart matching в 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" ; 
} 
+0

Или просто 'if (% s ~~/queen /) {say" Here I am}} 'поскольку'% hash ~~ $ rx' определяется как shortcircuiting 'grep' ключей для шаблона. – tchrist

Смежные вопросы