【问题标题】:Test if a string contains the key of a hash in Perl在 Perl 中测试字符串是否包含哈希的键
【发布时间】:2014-11-26 23:25:15
【问题描述】:

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

#!/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 语句中)

【问题讨论】:

  • 问题是什么?

标签: regex string perl hashmap


【解决方案1】:
#!/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";
  }
}

【讨论】:

  • 谢谢你,但我对 perl 有点陌生,你能解释一下 "-1 != index($str, $key)"
  • index 函数在$key 不在$str$key$str 中的位置时返回-1(从0$str 长度) 如果是的话。
  • 这是一种相当不正统的写作方式print "$value\n" if index($str, $key)>0;
  • @jaypal,>=,而不是 >
【解决方案2】:

如果您必须搜索多个字符串但只有一个不变的哈希,则将哈希键预先编译成正则表达式可能会更快,然后将该正则表达式应用于每个字符串。

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

【讨论】:

    【解决方案3】:

    在某些情况下(大哈希,键是单词,您不希望它们匹配子单词)这可能是正确的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 2012-08-10
      • 2015-03-28
      • 2011-06-14
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多