有一些带单词的字符串,用空格分隔。我需要获得每个单词中带有特定子字符串的单词数组,这些单词应该是唯一的。可以例如完成这样的方式:
%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中):
现在禁止在标量上使用实验键
答案 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