Как сравнить две строки в Perl?

Как сравнить две строки в Perl?

Я изучаю Perl, у меня был этот основной вопрос, посмотрев его здесь на StackOverflow и не нашел хорошего ответа, поэтому я подумал, что попрошу.

См. Perldoc perlop . Используйте lt , gt , eq , ne и cmp если это необходимо для сравнения строк:

Двоичный eq возвращает true, если левый аргумент по строкам равен правильному аргументу.

Binary ne возвращает true, если левый аргумент не соответствует правильному аргументу.

Двоичный cmp возвращает -1, 0 или 1 в зависимости от того, является ли левый аргумент строковым меньше, равным или большим, чем правый аргумент.

Binary ~~ делает smartmatch между его аргументами. …

lt , le , ge , gt и cmp используют порядок сортировки (сортировки), указанный текущей локалью, если действующий язык использования (но не use locale ':not_characters' ) действует. См. Perllocale . Не смешивайте их с Unicode, только с устаревшими двоичными кодировками. Стандартные Unicode :: Collate и Unicode :: Collate :: Locale модули предлагают гораздо более мощные решения проблем сортировки.

  • cmp Сравнить

     'a' cmp 'b' # -1 'b' cmp 'a' # 1 'a' cmp 'a' # 0 
  • eq Equal to

     'a' eq 'b' # 0 'b' eq 'a' # 0 'a' eq 'a' # 1 
  • ne Неравномерно

     'a' ne 'b' # 1 'b' ne 'a' # 1 'a' ne 'a' # 0 
  • lt Меньше, чем

     'a' lt 'b' # 1 'b' lt 'a' # 0 'a' lt 'a' # 0 
  • le Меньше или равно

     'a' le 'b' # 1 'b' le 'a' # 0 'a' le 'a' # 1 
  • более

     'a' gt 'b' # 0 'b' gt 'a' # 1 'a' gt 'a' # 0 
  • ge Больше или равно

     'a' ge 'b' # 0 'b' ge 'a' # 1 'a' ge 'a' # 1 

См. perldoc perlop для получения дополнительной информации.

(Я немного упрощаю это, так как все, кроме cmp возвращают значение, которое является пустой строкой, и числовым нулевым значением вместо 0 , а также значением, которое является как строкой '1' и числовым значением 1 Эти те же значения, которые вы всегда будете получать из логических операторов в Perl. На самом деле вы должны использовать только возвращаемые значения для логических или числовых операций, и в этом случае разница не имеет значения.)

В дополнение к всеобъемлющему списку операторов сравнения строк Sinan Ünür, Perl 5.10 добавляет оператор smart match.

Оператор smart match сравнивает два элемента в зависимости от их типа. См. Таблицу ниже для поведения 5.10 (я считаю, что это поведение немного меняется в 5.10.1):

perldoc perlsyn «Интеллектуальное согласование по деталям» :

Поведение умного соответствия зависит от того, что это за аргументы. Он всегда коммутативен, т.е. $a ~~ $b ведет себя так же, как $b ~~ $a . Поведение определяется следующей таблицей: первая строка, которая применяется в любом порядке, определяет поведение совпадения.

   $ a $ b Тип соответствия Подразумеваемый код соответствия
   ====== ===== ==================== =======================================================
   (перегружает козыри все)

   Код [+] Код [+] ссылочное равенство $ a == $ b   
   Любой код [+] скалярная суба истина $ b -> ($ a)   

   Хэш hash-hash-ключи идентичны [ключи сортировки% $ a] ~~ [ключи сортировки% $ b]
   Hash Array hash slice существование grep {существует $ a -> {$ _}} @ $ b
   Hash Regex hash key grep grep / $ b /, ключи% $ a
   Хэш Хэш-запись существует существует $ a -> {$ b}

   Массивы массива идентичны [*]
   Array Regex array grep grep / $ b /, @ $ a
   Array Num array содержит число grep $ _ == $ b, @ $ a 
   Массив Любой массив содержит строку grep $ _ eq $ b, @ $ a 

   Любой undef undefined! Defined $ a
   Любой шаблон Regex соответствует $ a = ~ / $ b / 
   Code () Code () равны $ a -> () eq $ b -> ()
   Любой код () простая истина закрытия $ b -> () # игнорирование $ a
   Num numish [!] Числовое равенство $ a == $ b   
   Любое равенство строки Str $ a eq $ b   
   Любое числовое числовое равенство $ a == $ b   

   Любое любое равенство строк $ a eq $ b   

 + - это должна быть ссылка на код, прототип которой (если присутствует) не является ""
 (субмарины с «прототипом» рассматриваются с помощью записи «Code ()» ниже) 
 * - то есть каждый элемент соответствует элементу того же индекса в другом
 массив.  Если найдена круговая ссылка, мы возвращаемся к ссылочным 
 равенство.   
 !  - либо действительное число, либо строку, которая выглядит как число

Разумеется, «код соответствия» не представляет собой настоящий код соответствия: он просто объясняет предполагаемый смысл. В отличие от grep, оператор smart match будет замыкаться каждый раз, когда это возможно.

Пользовательское сопоставление через перегрузку Вы можете изменить способ сопоставления объекта перегрузкой оператора ~~ . Это превосходит обычную интеллектуальную семантику соответствия. См. 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 

Вкратце:

  • Perl не имеет тип данных исключительно для текстовых строк
  • use == or != , чтобы сравнить два операнда как числа
  • используйте eq или ne , чтобы сравнить два операнда в виде текста

Существует множество других функций и операторов, которые могут использоваться для сравнения скалярных значений, но знание различия между этими двумя формами является важным первым шагом.

И если вы хотите извлечь различия между двумя строками, вы можете использовать String :: Diff .

Давайте будем гением компьютера.