从地图检索哈希键

时间:2018-10-15 19:27:21

标签: regex perl hashmap

有一些带单词的字符串,用空格分隔。我需要获得每个单词中带有特定子字符串的单词数组,这些单词应该是唯一的。可以例如完成这样的方式:

%arr = map { $_ => 1 } grep /foo/, $str=~/\b(\w+)\b/g;
@arr = keys %arr;

但这是单行的,为简单起见,我尝试这样做:

@arr = keys map { $_ => 1 } grep /foo/, $str=~/\b(\w+)\b/g;

但是我得到了错误(在Perl 5.24.1中):

  

现在禁止在标量上使用实验键

不幸的是,12帖子并没有帮助我理解应该如何正确地完成操作。

1 个答案:

答案 0 :(得分:6)

您忘了实际创建哈希!

my @arr = keys %{ +{ map { $_ => 1 } grep /foo/, $str =~ /\b(\w+)\b/g } };

但是有一种更好的方法来消除重复。

my %seen;
my @arr = grep !$seen{$_}++, grep /foo/, $str =~ /\b(\w+)\b/g;

sub uniq { my %seen; grep !$seen{$_}++, @_ }

my @arr = uniq grep /foo/, $str =~ /\b(\w+)\b/g;

use List::Util qw( uniq );

my @arr = uniq grep /foo/, $str =~ /\b(\w+)\b/g;

顺便

grep /foo/, $str =~ /\b(\w+)\b/g

可以简化为

$str =~ /\b\w*foo\w*+/g