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

На основе это руководство для Подвижного мой .gitignore включает:

.DS_Store
*.swp
*~.nib

build/

*.pbxuser
*.perspective
*.perspectivev3

я также принял решение включать:

*.mode1v3
*.mode2v3

, который, согласно это сообщение списка рассылки Apple , "определенные для пользователя настройки проекта".

И для Xcode 4:

xcuserdata

171
задан Sinan Ünür 24 July 2009 в 01:36
поделиться

4 ответа

См. perldoc perlop . Для сравнения строк используйте lt , gt , eq , ne и cmp :

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

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

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

Двоичный ~~ сопоставляет свои аргументы. ...

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

175
ответ дан 23 November 2019 в 20:43
поделиться
  • cmp Сравнить

     'a' cmp 'b' # -1
    'b' cmp 'a' # 1
    'a' cmp 'a' # 0
    
  • eq Равно

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

     'a' ne 'b' # 1
    'b' ne 'a' # 1
    'а' не 'а' # 0
    
  • lt Менее

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

     'a' le 'b' # 1
    'b' le 'a' # 0
    'а' ле 'а' # 1
    
  • gt Больше, чем

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

134
ответ дан 23 November 2019 в 20:43
поделиться

В дополнение к исчерпывающему списку операторов сравнения строк Синан Юнюр, Perl 5.10 добавляет Оператор интеллектуального сопоставления.

Оператор интеллектуального сопоставления сравнивает два элемента в зависимости от их типа. См. Диаграмму ниже для поведения 5.10 (я считаю, что это поведение немного изменилось в 5.10.1):

perldoc perlsyn «Подробное интеллектуальное сопоставление» :

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

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

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

 Хэш Хеш-ключи идентичны [ключи сортировки% $ a] ~~ [ключи сортировки% $ b]
 Существование хеш-среза массива хешей grep {exists $ a -> {$ _}} @ $ b
 Хэш-ключ хеш-функции Regex grep grep / $ b /, ключи% $ a
 Хеш Существуют любые хеш-записи $ a -> {$ b}

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

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

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

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

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

Пользовательское соответствие через перегрузку Вы можете изменить способ сопоставления объекта, перегрузив оператор ~~ . Это превосходит обычную семантику интеллектуального соответствия. См. перегрузка .

17
ответ дан 23 November 2019 в 20:43
поделиться
print "Matched!\n" if ($str1 eq $str2)

Perl имеет отдельные операторы сравнения строк и числовых сравнений для облегчения набора текста на языке. Вы должны прочитать perlop для всех различных операторов.

10
ответ дан 23 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: