Как сравнить две строки в Perl?
Как сравнить две строки в Perl?
Я изучаю Perl, у меня был этот основной вопрос, посмотрел его здесь на StackOverflow и не нашел хорошего ответа, поэтому я подумал, что спрошу.
6 ответов
посмотреть perldoc perlop. Использовать lt
, gt
, eq
, ne
и cmp
как подходит для сравнения строк:
Бинарные
eq
возвращает true, если левый аргумент по строке равен правому аргументу.Бинарные
ne
возвращает true, если левый аргумент stringwise не равен правому аргументу.Бинарные
cmp
возвращает -1, 0 или 1 в зависимости от того, левый аргумент stringwise меньше, равно или больше, чем правильный аргумент.Бинарные
~~
делает 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 не имеет различных типов данных для текста и чисел. Они оба представлены типом "скаляр". Иными словами, строки are цифры если вы используете их в качестве таковых.
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 не имеет типа данных исключительно для текстовых строк
- использовать
==
или!=
, чтобы сравнить два операнда как числа - использовать
eq
илиne
, чтобы сравнить два операнда, как текст
есть много других функций и операторов, которые можно использовать для сравнения скалярных значений, но знание различия между этими двумя формами является важным первым шагом.
и если вы хотите, чтобы извлечь различия между двумя строками, вы можете использовать String:: Diff.