我试图在比较操作中使用模式匹配的结果。似乎无法让它发挥作用。
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.";
}
尽管如此,我很想知道为什么前三个代码示例无法正常工作。
答案 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.";
}