在比较中使用正则表达式的结果

时间:2015-03-23 19:52:13

标签: regex perl match

我试图在比较操作中使用模式匹配的结果。似乎无法让它发挥作用。

if语句在这里返回false:

if (('6kjkjd' =~ /(\d)/) > 5) {
  print "Why isn't this printing? 6 is greater than 5.";
}

以及:

my $start;
if ((($start) = '6kjkj' =~ /(\d)/) > 5) {
  print "Why isn't this printing? 6 is greater than 5.";
}

我尝试从比较操作的左侧移除parens,但这总是会产生真正的价值:

my $start;
if (($start) = '6kjkj' =~ /(\d)/ > 7) {
  print "This gets printed even though 6 is not greater than 7.";
}

我意识到我可以把它分成两行:

my ($start) = '6kjkj' =~ /(\d)/;
if ($start > 5) {
  print "This works as expected.";
}

尽管如此,我很想知道为什么前三个代码示例无法正常工作。

2 个答案:

答案 0 :(得分:2)

列表与标量上下文:

if (('6kjkjd' =~ /(\d)/)[0] > 5) {
    print "Why isn't this printing? 6 is greater than 5.";
}

基本上,在if条件的范围内,您处于标量上下文中。

当你写:

my $start;
if ((($start) = '6kjkj' =~ /(\d)/) > 5)

$start的作业发生了,但列表($start)只有一个元素。

如果你坚持写一个复杂的表达而不是把事情分成几部分,你可以利用逗号运算符:

if ((($start) = '6kjkj' =~ /(\d)/), $start > 5) {
  print "Why isn't this printing? 6 is greater than 5.";
}

Sam Choukri在评论中指出,

if (('6kjkj' =~ /(\d)/) and ($1 > 5)) {

比我最初想到的两种替代方案更安全,更简单。

答案 1 :(得分:2)

这是因为标量上下文中的运算符=~会返回操作的成功。

让我们list-context(通过添加[0]):

if ((('6kjkjd' =~ /(\d)/)[0]) > 5)
{
  print "Why isn't this printing? 6 is greater than 5.";
}
相关问题