Как я могу проверить, что строка соответствует всем шаблонам в массиве, используя smartmatch?

Я хочу проверить, соответствует ли строка нескольким шаблонам регулярных выражений. Я наткнулся на связанный вопрос, на который Брэд Гилберт ответил с помощью оператора smartmatch:

my @matches = (
  qr/.*\.so$/,
  qr/.*_mdb\.v$/,
  qr/.*daidir/,
  qr/\.__solver_cache__/,
  qr/csrc/,
  qr/csrc\.vmc/,
  qr/gensimv/,
);

if( $_ ~~ @matches ){
  ...
}

Оператор if вводится, если какой-либо из шаблонов совпадает, но я хочу проверить, совпадают ли все шаблоны. Как я могу это сделать?


person Starfish    schedule 08.09.2016    source источник
comment
Таким образом, у вас есть список предварительно скомпилированных регулярных выражений, и вы хотите написать код, который возвращает true, если все шаблоны соответствуют RHS оператора smartmatch. Если это так, отредактируйте свой вопрос и включите его, а также пример ввода/вывода.   -  person simbabque    schedule 08.09.2016
comment
Мы должны создать тег-синоним для smart-matching и smartmatch.   -  person simbabque    schedule 08.09.2016
comment
@simbabque Во всяком случае, smart-matching должен быть синонимом smartmatch, поскольку имя оператор smartmatch. Единственными пользователями, которые могут предлагать и одобрять синоним, являются ikegami, Joel Berger, raina77ow и Kenney (и они все должны голосовать), если только вы не пометите некоторые существующие вопросы или не получите +5 за ответ на этот вопрос. Но нужен ли тег вообще? Я не думаю, что нам нужен тег для каждого оператора в языке.   -  person ThisSuitIsBlackNot    schedule 08.09.2016
comment
@это я согласен с вашим заказом. Но у меня двоякое мнение по поводу тега. Это фича, а не просто оператор. И это сложно и странно, и у обоих тегов есть полезные вики. Я не уверена. Возможно, нам стоит обсудить это на мета, хотя люди, не относящиеся к Perl, в целом могут иметь другое мнение.   -  person simbabque    schedule 08.09.2016
comment
@ThisSuitIsBlackNot, что? Почему я? Все для этого, однако. // Что касается того, нужен нам этот тег или нет, Smartmatching определенно достаточно особенный, чтобы он мог понадобиться. Я также предвижу, что будет больше вопросов по теме после изменения смартматча (в 5.26?)   -  person ikegami    schedule 08.09.2016
comment
@ikegami Вы должны иметь как минимум +5 баллов в теге, чтобы предлагать / голосовать за синонимы. Однако система предложений синонимов довольно убогая (в очереди все еще есть предложение от 2012 года!), поэтому я просто пропинговал мод, чтобы узнать, могут ли они это сделать.   -  person ThisSuitIsBlackNot    schedule 08.09.2016
comment
@simbabque Мне не удалось отследить мод, чтобы сделать его синонимом, даже после публикации на Meta, поэтому я просто повторно пометил все вопросы smart-matching на smartmatch. Я также предложил редактирование для обновления tag wiki и выдержка из вики, которые были устаревшими и неточными. Если бы вы могли взглянуть на мои правки, я был бы признателен.   -  person ThisSuitIsBlackNot    schedule 22.09.2016
comment
@ThisSuitIsBlackНеприятно. :)   -  person simbabque    schedule 22.09.2016


Ответы (1)


Оператор Smartmatch не поддерживает это. Вам придется построить его самостоятельно. List::MoreUtils' all отлично подходит для этого.

use strict;
use warnings 'all';
use feature 'say';
use List::MoreUtils 'all';

my @matches = (
    qr/foo/,
    qr/ooo/,
    qr/bar/,
    qr/asdf/,
);

my $string = 'fooooobar';
say $string if all { $string =~ $_ } @matches;

Это не дает выхода.

Если вы измените $string на 'fooooobarasdf', будет выведена строка.

person simbabque    schedule 08.09.2016
comment
Стоит отметить, что в любом случае не следует использовать smartmatch. Оно помечено как экспериментальное и будет удалено или изменено без предварительного уведомления. (Похоже, это произойдет в 5.26.) - person ikegami; 08.09.2016
comment
@ikegami Да. Я намеренно исключил это из ответа, потому что планировал комментарий, подобный вашему, но забыл. - person simbabque; 08.09.2016
comment
List::Util теперь также имеет all, так что вам даже не нужен List ::MoreUtils. - person melpomene; 19.09.2016