3

请帮助我理解字符串相等的一个奇怪问题。这是我正在谈论的代码:

my $test=undef;
foreach my $List (@o_descrL) {
  if (!($test)) {
    $test = defined($o_noreg)
      ? $descr_d eq $List
      : $descr_d =~ /$List/i;
      printf("$descr_d = $List\t\t==> $test\n");
   }
}

不幸的是我没有写它,但我必须理解它。$List始终是“SQL Server (C4)”,$descr_d根据数组中的实际项目而变化。部分打印输出在这里:

Power = SQL Server (C4)         ==>
SQL Server (C4) = SQL Server (C4)               ==>
SNMP Service = SQL Server (C4)          ==>
Network Connections = SQL Server (C4)           ==>

如您所见,输出的第二行中的字符串是相等的。那为什么不是$test真的?


编辑:我打印了更多输出,发现 when $descr_d eq $List,它等于,但不是 if $descr_d =~ $List。您能否解释一下实际放入$test变量的内容?我不明白defined() ? :这里是什么意思。


EDIT2:对于字符串“SQL Server Agent”,脚本工作得很好,只有在附加(C4)时才会出现问题。很奇怪,不是吗?

4

1 回答 1

11

当字符串被插入为正则表达式时,它不会按字面意思匹配,而是解释为正则表达式。这对于构建复杂的正则表达式很有用,例如

my @animals = qw/ cat dog goldfish /;
my $animal_re = join "|", @animals;

say "The $thing is an animal" if $thing =~ /$animal_re/i;

在 string$animal_re中,|被视为正则表达式元字符。

其他元字符是 eg (...),它是一个捕获组。这存在于您的$List. 也就是说,您的正则表达式实际上是在寻找字符串并在成功时SQL Server C4捕获。C4

要停用元字符,您可以像这样引用它们

/\Q$metachars\E/

在你的情况下:

$test = defined($o_noreg)
      ? $descr_d eq $List
      : $descr_d =~ /\Q$List/i;

顺便说一句,Perl 的默认 false 值是空字符串。如果您将其强制为一个数字,例如 via ,您的输出可能更具可读性$test += 0。打印出用引号括起来的字符串也可能会有所帮助:

print qq("$descr_d" = "$List"\t==> $test\n);

回复:您的编辑

条件运算符在类 C 语言中很常见。它由三部分组成:

COND ? EXPR_A : EXPR_B

如果条件COND为真,EXPR_A则计算表达式;否则,EXPR_B就是。在您的代码中,被评估的表达式的值被分配给$test.

内置测试标量持有的defined值是否为undef。如果是这种情况,它会返回一个假值,1否则。这用于此处的某些配置:当$o_noreg设置为除 之外的任何值undef时,将使用默认字符串比较。如果是undef,则将执行正则表达式。

回复:编辑2

不,这并不奇怪:SQL Server (C4)包含()元字符,而不SQL Server Agent包含任何元字符。

于 2013-06-25T12:43:03.700 回答