Сравните две строки независимо от размера регистра в perl - PullRequest
10 голосов
/ 03 августа 2010

В любом случае можно сравнить две строки независимо от размера регистра? Например

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

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

Ответы [ 3 ]

19 голосов
/ 03 августа 2010

да - используйте 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"

10 голосов
/ 03 августа 2010

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

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

    lc "steve" eq lc "STevE";

Простое регулярное выражение тоже подойдет:

'steve' =~ /^STevE$/i;
1 голос
/ 16 июня 2017

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

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

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

use feature 'fc';
...