1

我有一个写字板文件,从中提取两个字符串并进行比较。在这种情况下,它们都是相等的,但我不能使用=~表达式来评估它们。

if($pin_list =~ /$lvl_list/){ do something}

我在调试模式下尝试过的内容:

  1. 两个字符串相等,由eq
  2. 两个字符串相等,由==
  3. 手动将另一个变量设置为相同的字符串,然后if使用新变量执行语句;if($pin_list =~ /$x/){do something}. 这次尝试是成功的。
  4. 对两个字符串变量执行chomp(var)了几次,然后运行代码。失败的
  5. $tst_pins =~ s/\n//g删除了两个 var 上的回车。失败的
  6. 两个变量的长度相同。
  7. 手动打印两个 var 并目视验证两个字符串是相同的。

有人有什么想法吗?我怀疑这与写字板有关,也可能与隐藏字符有关,但不知道如何追踪它。


tchrist -> 好问题。在这种情况下,字符串是相等的,但情况并非总是如此。在正常情况下,我只是在寻找一个字符串作为另一个字符串的子集。


对于那些可能感兴趣的人。问题解决了。

我有一个字符串,我用“+”“加入”。所以字符串如下所示:

“1+2+3+4+a+b+等”

'+' 最终成为问题。在一位同事的建议下,我执行了一个 substr 并将其中一个字符串削减到违规点。它发生在它捕获'+'之后。然后我使用空格而不是“+”加入,一切正常。

使用除字母表之外的不同字符会产生影响,我仍然无法解释为什么当其他所有内容都说它是平等的时候。

布雷特

4

2 回答 2

4

匹配运算符 ( m//aka //) 检查提供的字符串是否与提供的正则表达式模式匹配,而不是字符对字符是否等于提供的正则表达式模式。如果您想构建一个与字符串完全匹配的正则表达式模式,请使用quotemeta.

这检查是否$str1等于$str2

my $pat = quotemeta($str1);
$str2 =~ /^$pat\z/

quotemeta也可以通过调用\Q..\E

$str1 =~ /^\Q$str2\E\z/

当然,你可以只使用eq.

$str1 eq $str2
于 2011-04-14T19:14:56.633 回答
3

+并且其他字符在正则表达式中具有特殊含义,因此仅使用$expression =~ /$some_arbitrary_string/可能会给您带来麻烦。

如果问题是一个字符串是否真的包含在另一个字符串中,您可以使用index而不用担心指定正则表达式的所有规则:

if (index($pin_list, $lvl_list) >= 0) {
    do_something;
}
于 2011-04-14T19:04:13.730 回答