Perl экранирует подстановочный знак при сопоставлении ключей хеша - PullRequest
0 голосов
/ 14 февраля 2019

Подскажите, пожалуйста, как избежать подстановочного знака, найденного в хеш-ключах.

print "pattern exists\n" if /.ISPV3-21*02/ ~~ %reads;

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2019

Во-первых, обратите внимание, что smartmatch (~~) является экспериментальным, поэтому его не рекомендуется использовать. * Для этой задачи вы можете использовать any из List :: Util или для старых perls grep может служить той же цели.

Если вы пытаетесь сопоставить точную строку, используйте quotemeta , которая также может быть записана как \Q в интерполированной строке.

use strict;
use warnings;
use List::Util 1.33 'any';
print "pattern exists\n" if any { m/\Q.ISPV3-21*02/ } keys %reads;

Вы также можете использовать функцию index , чтобы найти точную подстроку.

print "pattern exists\n" if any { index($_, '.ISPV3-21*02') >= 0 } keys %reads;

Если вы пытаетесь сопоставить весь ключ, а не только подстроку в пределахключом, вам нужно закрепить соответствие регулярному выражению с \A (начало строки, такое же как ^) и \z (конец строки).

print "pattern exists\n" if any { m/\A\Q.ISPV3-21*02\E\z/ } keys %reads;

Но это то же самое, чтопросто проверка на равенство строк .

print "pattern exists\n" if any { $_ eq '.ISPV3-21*02' } keys %reads;

И это тоже самое, что просто проверить, существует ли ключ , поскольку вы просматриваете ключи хеша.

print "pattern exists\n" if exists $reads{'.ISPV3-21*02'};

* Smartmatch был задним числом сделан экспериментальным как часть введенияиз-за его слишком сложного набора правил (вы должны просмотреть всю таблицу 1038 * в документах, чтобы выяснить, к чему будут обращаться любые два операнда, а также каждое их содержимое) ита же самая двусмысленность строки / числа как побитовые операторы .В нем было несколько итераций предлагаемых изменений, и, вероятно, в какой-то момент он будет устаревшим или несовместимым, поэтому на него не следует полагаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...