Получение хеш-ключей с карты - PullRequest
0 голосов
/ 15 октября 2018

Есть некоторая строка со словами, разделенными пробелами.Мне нужно получить массив слов с определенной подстрокой в ​​каждом слове, слова должны быть уникальными.Это может быть сделано, например, таким образом:

%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):

Экспериментальные ключи на скаляре теперь запрещены

К сожалению 1 и 2 сообщения не помогличтобы я понял, как это должно быть сделано правильно.

1 Ответ

0 голосов
/ 15 октября 2018

Вы действительно забыли создать хеш!

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...