6 ответов:
посмотреть perldoc perlop. Используйте
lt,gt,eq,neиcmpкак подходит для сравнения строк:Binary
eqвозвращает true, если левый аргумент по строкам равен правому аргументу.Binary
neвозвращает true, если левый аргумент по строкам не равен правому аргументу.Binary
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равна'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
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. Вы действительно должны использовать только возвращаемые значения для boolean или числовые операции, в этом случае разница не имеет значения. )
в дополнение к Sinan Ünür полный список операторов сравнения строк, Perl 5.10 добавляет оператор smart match.
оператор smart match сравнивает два элемента в зависимости от их типа. См. диаграмму ниже для поведения 5.10 (я считаю, что это поведение немного меняется в 5.10.1):
perldoc perlsyn"умное соответствие в деталях":Поведение умного матча зависит от того, какие у него аргументы. Оно всегда коммутативно, т. е.
$a ~~ $bаналогично$b ~~ $a. Поведение определяется следующей таблицей: первая строка, которая применяется в любом порядке, определяет поведение соответствия.
$a $b Type of Match Implied Matching Code ====== ===== ===================== ============= (overloading trumps everything) Code[+] Code[+] referential equality $a == $b Any Code[+] scalar sub truth $b−>($a) Hash Hash hash keys identical [sort keys %$a]~~[sort keys %$b] Hash Array hash slice existence grep {exists $a−>{$_}} @$b Hash Regex hash key grep grep /$b/, keys %$a Hash Any hash entry existence exists $a−>{$b} Array Array arrays are identical[*] Array Regex array grep grep /$b/, @$a Array Num array contains number grep $_ == $b, @$a Array Any array contains string grep $_ eq $b, @$a Any undef undefined !defined $a Any Regex pattern match $a =~ /$b/ Code() Code() results are equal $a−>() eq $b−>() Any Code() simple closure truth $b−>() # ignoring $a Num numish[!] numeric equality $a == $b Any Str string equality $a eq $b Any Num numeric equality $a == $b Any Any string equality $a eq $b + − this must be a code reference whose prototype (if present) is not "" (subs with a "" prototype are dealt with by the 'Code()' entry lower down) * − that is, each element matches the element of same index in the other array. If a circular reference is found, we fall back to referential equality. ! − either a real number, or a string that looks like a numberКонечно, "соответствующий код" не представляет собой реальный соответствующий код: он просто объясняет предполагаемый смысл. В отличие от 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так как текст и цифры не различаются язык, мы не можем просто перегрузить
==оператор, чтобы сделать правильную вещь для обоих случаев. Таким образом, на Perleqдля сравнения значений в виде текста:if ( "4" eq "4.0" ) { print "true"; } else { print "false"; } false if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; } true
короче:
- Perl не имеет типа данных исключительно для текстовых строк
- использовать
==или!=, чтобы сравнить два операнда как числа- использовать
eqилиne, чтобы сравнить два операнда, как текстесть много других функций и операторов, которые могут быть использованы для сравнения скалярных значений, но, зная различия между этими двумя формами является важным первым шагом.
и если вы хотите, чтобы извлечь различия между двумя строками, вы можете использовать String:: Diff.
Comments