Как сравнить две строки в Perl?
Я изучаю Perl, этот основной вопрос я нашел здесь, в StackOverflow, и не нашел хорошего ответа, так что я решил спросить.
Как сравнить две строки в Perl?
Я изучаю Perl, этот основной вопрос я нашел здесь, в StackOverflow, и не нашел хорошего ответа, так что я решил спросить.
Ответы:
Смотрите perldoc perlop . Используйте lt, gt, eq, ne, и cmpв соответствующих случаях для сравнения строк:
Двоичный
eqвозвращает значение true, если левый аргумент по строкам равен правому аргументу.двоичный
neвозвращает значение true, если левый аргумент по строкам не равен правому аргументу.Двоичный код
cmpвозвращает -1, 0 или 1 в зависимости от того, является ли левый аргумент по строкам меньше, равен или больше правого аргумента.Бинарный
~~код делает умный матч между своими аргументами. ...
lt,le,ge,gtИcmpиспользовать параметры сортировки (сортировка) порядок , указанный в текущей локали , если в наследство использование локали (но неuse locale ':not_characters') действует. Смотрите Perllocale . Не смешивайте их с Unicode, только с устаревшими двоичными кодировками. Стандартные модули Unicode :: Collate и Unicode :: Collate :: Locale предлагают гораздо более мощные решения проблем сортировки.
indexчтобы увидеть, является ли строка подстрокой другой.
!=и neне то же самое, потому что !=и neопределены как разные. Насколько это сложно ?! Будучи оператором сравнения !=чисел , оба его операнда преобразуются в числа perl -E 'say "equal" if not "a" != "b"'.
cmp сравнить
'a' cmp 'b' # -1
'b' cmp 'a' # 1
'a' cmp 'a' # 0eq Равно
'a' eq 'b' # 0
'b' eq 'a' # 0
'a' eq 'a' # 1ne Не равно
'a' ne 'b' # 1
'b' ne 'a' # 1
'a' ne 'a' # 0lt Меньше, чем
'a' lt 'b' # 1
'b' lt 'a' # 0
'a' lt 'a' # 0le Меньше или равно
'a' le 'b' # 1
'b' le 'a' # 0
'a' le 'a' # 1gt Лучше чем
'a' gt 'b' # 0
'b' gt 'a' # 1
'a' gt 'a' # 0ge Больше или равно
'a' ge 'b' # 0
'b' ge 'a' # 1
'a' ge 'a' # 1Смотрите perldoc perlopдля получения дополнительной информации.
(Я немного упрощаю это, так как все, но cmpвозвращаю значение, которое является одновременно пустой строкой и численно нулевым значением вместо 0, и значение, которое является одновременно строкой '1'и числовым значением 1. Это те же значения, которые вы будете всегда получайте логические операторы в Perl. На самом деле вы должны использовать только возвращаемые значения для логических или числовых операций, и в этом случае разница на самом деле не имеет значения.)
eq, gtи ltт. Д. Не верны ... Они возвращают истину или ложь. cmpВозвращает только конкретные числовые значения.
legвместо cmpних он используется для общих сравнений.
В дополнение к полному списку операторов сравнения строк в Sinan Ünür, Perl 5.10 добавляет оператор интеллектуального сопоставления.
Оператор умного сопоставления сравнивает два элемента в зависимости от их типа. См. Таблицу ниже для поведения 5.10 (я считаю, что это поведение немного меняется в 5.10.1):
perldoc perlsyn«Умное сопоставление в деталях» :Поведение интеллектуального соответствия зависит от того, к какому типу относятся его аргументы. Он всегда коммутативен, т.е.
$a ~~ $bведет себя так же, как$b ~~ $a. Поведение определяется следующей таблицей: первая применяемая строка в любом порядке определяет поведение совпадения.
$ a $ b Тип кода, подразумевающего совпадение ====== ===== ===================== ============= (перегрузка превосходит все) Код [+] Код [+] ссылочное равенство $ a == $ b Любой код [+] скалярная суб-истина $ b -> ($ a) Хэш Хэш-ключи идентичны [ключи сортировки% $ a] ~~ [ключи сортировки% $ b] Существование среза хеш-массива grep {существует $ a -> {$ _}} @ $ b Hash Regex grep grep / $ b /, ключи% $ a Хеш Любая сущность хеш-записи существует $ a -> {$ b} Массив Массивы идентичны [*] Массив Regex массив grep grep / $ b /, @ $ a Массив Array Num содержит число grep $ _ == $ b, @ $ a Массив Любой массив содержит строку grep $ _ eq $ b, @ $ a Любой undef undefined! Определен $ a Любой шаблон регулярного выражения соответствует $ a = ~ / $ b / Code () Code () результаты равны $ a -> () eq $ b -> () Любая Code () истина простого замыкания $ b -> () # игнорирует $ a Num numish [!] Числовое равенство $ a == $ b Любое равенство строк Str $ a eq $ b Любое Num числовое равенство $ a == $ b Any Любое равенство строк $ a eq $ b + - это должна быть ссылка на код, чей прототип (если есть) не "" (подпрограммы с прототипом "" обрабатываются записью Code () внизу) * - то есть каждый элемент соответствует элементу с тем же индексом в другом массив. Если круговая ссылка найдена, мы возвращаемся к ссылочной равенство. ! - либо действительное число, либо строка, которая выглядит как число«Соответствующий код», конечно же, не представляет реальный соответствующий код: он просто объясняет предполагаемое значение. В отличие от grep, оператор интеллектуального сопоставления будет закорачивать всякий раз, когда это возможно.
Пользовательское сопоставление с помощью перегрузки Вы можете изменить способ сопоставления объекта путем перегрузки
~~оператора. Это превосходит обычную семантику умного соответствия. Смoverload.
print "Matched!\n" if ($str1 eq $str2)
В Perl есть отдельные операторы сравнения строк и числового сравнения, чтобы помочь с неправильной типизацией в языке. Вы должны прочитать perlop для всех различных операторов.
Очевидный подтекст этого вопроса:
почему вы не можете просто использовать,
==чтобы проверить, совпадают ли две строки?
Perl не имеет определенных типов данных для текста против чисел. Они оба представлены типом «скаляр» . Другими словами, строки - это числа, если вы используете их как таковые .
if ( 4 == "4" ) { print "true"; } else { print "false"; }
true
if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true
print "3"+4
7
Поскольку текст и числа не различаются по языку, мы не можем просто перегрузить ==оператор, чтобы сделать правильные вещи в обоих случаях. Следовательно, Perl позволяет eqсравнивать значения как текст:
if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false
if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true
Коротко:
==или !=, чтобы сравнить два операнда как числаeqили ne, чтобы сравнить два операнда как текстСуществует много других функций и операторов, которые можно использовать для сравнения скалярных значений, но знание различия между этими двумя формами является важным первым шагом.
И если вы хотите извлечь различия между двумя строками, вы можете использовать String :: Diff .