Во-первых, обратите внимание, что 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 * в документах, чтобы выяснить, к чему будут обращаться любые два операнда, а также каждое их содержимое) ита же самая двусмысленность строки / числа как побитовые операторы .В нем было несколько итераций предлагаемых изменений, и, вероятно, в какой-то момент он будет устаревшим или несовместимым, поэтому на него не следует полагаться.