Сравните две строки независимо от размера регистра в perl

Есть ли способ сравнить две строки независимо от размера регистра? Для примера

"steve" eq "STevE"   <----- these would match
"SHOE" eq "shoe"

Вы получите изображение

Ответ 1

yes - используйте uc() (функция верхнего регистра, см. http://perldoc.perl.org/functions/uc.html)

$ perl -e 'print uc("steve") eq uc("STevE"); print "\n";'
1
$ perl -e 'print uc("SHOE") eq uc("shoe"); print "\n";'          
1
$ perl5.8 -e 'print uc("SHOE") eq uc("shoe1"); print "\n";'

$

Вы также можете использовать lc().

Если вы хотите, чтобы фактический оператор "eq" был нечувствительным к регистру, это может быть возможно с использованием перегрузок, но я не думаю, что вы просите - пожалуйста, уточните свой вопрос, если это произойдет. И это не отличная идея, если вы этого хотите, ИМХО - слишком хрупкая и приводит к серьезным трудностям для отслеживания и отладки ошибок.

Кроме того, это ваш избыток в вашем конкретном случае, когда вы просто хотите равенства, но регулярные выражения Perl также имеют независимый от случая модификатор "i"

Ответ 2

Несколько способов сделать это:

  • Используйте оператор lc или uc, который преобразует обе строки в нижний или верхний регистр соответственно:

    lc "steve" eq lc "STevE";

Простое регулярное выражение будет делать то же самое:

'steve' =~ /^STevE$/i;

Ответ 3

Согласно perldoc (http://perldoc.perl.org/functions/fc.html), лучше использовать

fc("steve") eq fc("STevE")

Не забудьте добавить эту строку перед первым использованием fc:

use feature 'fc';