regex - 从 map 中检索散列键

标签 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 中):

Experimental keys on scalar is now forbidden

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

最佳答案

你忘了实际创建一个散列!

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

关于regex - 从 map 中检索散列键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52823508/

相关文章:

perl - 为什么 pop/shift 不能与 perl 中的 map/grep 一起使用

java - 从 HashMap<String, HashSet<Integer>> 获取随机值

java - 从针对 List<String> 的嵌套 HashMap<String, HashMap<String, String>> 过滤器获取 HashMap 值

regex - 在 BASH 中使用正则表达式提取数字

regex - 每个 Referer 的 Apache 条件 header

c# - Regex.Split 加号和减号

perl - 在Perl中使用Getopt::Long获取多维数据结构

python - 列表的列表..列表的列表?应用正则表达式和 nltk

string - Perl:返回字符串的最高匹配百分比

java - 使用表中的数据