Regex 在Perl中测试字符串是否包含哈希键

Regex 在Perl中测试字符串是否包含哈希键,regex,string,perl,hashmap,Regex,String,Perl,Hashmap,我有一个字符串,想知道它是否包含散列的键,如果包含,我想这样打印散列的值: #!/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 }

我有一个字符串,想知道它是否包含散列的键,如果包含,我想这样打印散列的值:

#!/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
}

最好的方法是什么?(最好足够简洁,可以包含在if语句中)

如果必须搜索多个字符串,但只有一个不变的哈希,则可以提前将哈希键编译成regexp,然后将该regexp应用于每个字符串

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;
}

如果您必须搜索多个字符串,但只有一个不变的哈希,那么将哈希键预先编译为regexp,然后将该regexp应用于每个字符串可能会更快

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;
}
在某些情况下(大散列,键是单词,您不希望它们与子单词匹配),这可能是正确的方法:

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;
}
在某些情况下(大散列,键是单词,您不希望它们与子单词匹配),这可能是正确的方法:

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;
}

问题是什么?问题是什么?谢谢你,但我对perl有点陌生。你能解释一下吗?“-1!=index($str,$key)”
index
函数在
$key
不在
$str
时返回
-1
,或者
$key
$str
中的位置(从
0
$str长度)如果是的话。如果索引($str,$key)>0,那么这是一种非常非正统的编写
打印“$value\n”的方法
@jaypal,
=
,而不是
。谢谢你,但我对perl有点陌生。你能解释一下吗?“-1!=index($str,$key)”
index
函数在
$key
不在
$str
$key
$str中的位置时返回
-1
(从
0
到略低于
$str
长度)如果是的话。如果索引($str,$key)>0;
@jaypal,
=
,而不是
,那么这是一种非常非常规的书写方式。