2014-10-02 2 views
1

У меня есть строка и вы хотите узнать, содержит ли она ключ хеша, и если это так, я хотел бы напечатать значение хэша так:Проверьте, содержит ли строка ключ хэша в Perl

#!/usr/bin/perl -w 

my %h = ('key1' => 'v1', 'key2' => 'v2', 'key3' => 'v3'); 
my $str = "this is a string containing key1\n"; 
if ($str contains a key of %h){ 
    print the value of that key; #i.e v1 
} 

Каков наилучший способ для этого? (Желательно достаточно кратким, чтобы содержать в если заявление)

+0

Какой вопрос? –

ответ

3

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

my %h = ('key1' => 'v1', 'key2' => 'v2', 'key3' => 'v3'); 
my $hash_keys = qr/${\ join('|', map quotemeta, keys %h) }/; 

my @strings = (
    "this is a string containing key1\n", 
    "another string containing key1\n", 
    "this is a string containing key2\n", 
    "but this does not\n", 
); 

foreach my $str (@strings) { 
    print "$str\n" if $str =~ $hash_keys; 
} 
5
#!/bin/perl -w 

my %h = ('key1' => 'v1', 'key2' => 'v2', 'key3' => 'v3'); 
my $str = "this is a string containing key1\n"; 
while (($key, $value) = each %h) { 
    if (-1 != index($str, $key)) { 
    print "$value\n"; 
    } 
} 
+0

Спасибо за это, но я немного новичок в perl, не могли бы вы объяснить «-1! = Index ($ str, $ key)» – Jordan

+0

Функция 'index' возвращает' -1', когда '$ key' не находится в '$ str' или' $ key' в '$ str' (от' 0' до '' $ str'), если это так. – Amadan

+2

Thats довольно неортодоксальный способ записи 'print '$ value \ n" if index ($ str, $ key)> 0; ' –

1

В некоторых случаях (большой хэш, ключи слова, и вы не хотите, чтобы соответствовать суб-слов) это может быть правильный подход:

my %h = ('key1' => 'v1', 'key2' => 'v2', 'key3' => 'v3'); 
my $str = "this is a string containing key1 and key3 but notkey2, at least not alone\n"; 

while ($str =~ /(\w+)/g) { 
    my $v = $h{$1}; 
    print "$v\n" if defined $v; 
} 
Смежные вопросы