在Perl中比较两个字符串时不考虑大小写

16

有没有办法无论大小写比较两个字符串? 例如:

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

你明白了

3个回答

21

是的- 使用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”,但在你的情况下,这是一种过度设计。


16

有几种方法可以实现这个:

  • 使用lc或者uc操作符,分别将两个字符串转换为小写或大写:

    lc "steve" eq lc "STevE";
    
    一个简单的正则表达式就可以做到同样的效果:
    'steve' =~ /^STevE$/i;
    

请重新阅读smartmatch文档;最后一个例子会落入Any~~Regex的情况,这意味着左侧被字符串化并且使用右侧进行匹配。在5.10.1上,它似乎执行了"(?i-xsm:steve)" =~ /STevE/i,而我本来期望的是( $_ =~ /steve/i ) =~ /STevE/i,但在这里都不合适。 - ysth
N.B. 在 5.10.0 版本中的智能匹配存在设计缺陷(在 5.10.1 中已经修复),不应使用。 - ysth
也许我的评论太复杂了。简洁地说,这里的~~不起作用。例如,/steve/i ~~ /x/i 是正确的。 - ysth
你应该锚定你的正则表达式,'steven' =~ /STevE/i; 也会返回真。 - Ven'Tatsu

5

好的观点。基本上,fc类似于uc/lc,但能够处理非ASCII字符。 - PerlDuck
1
uclc也可以很好地处理Unicode字符。 - Alexander Balyuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接