我很高兴得知 Perl 可以在 5.32 版中处理链式比较
但是,我正在尝试进行链式正则表达式比较,以使我的代码更短更干净
#!/usr/bin/env perl
use 5.032;
use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
if (9 > 2 < 3 < 4 > 0) {
say 'chained expressions work.'
} else {
say 'chained expressions do not work.'
}
my $x = 4;
my $z = 4;
if ($x == 4 == $z) {
say 'chained equality works';
}
$x = 'x';
$z = 'x';
if ($x eq 'x' eq $z) {
say 'chained string comparisons work.';
}
$x = '.';
$z = './.';
if ($x =~ m/\./ =~ $z) { # unfortunately this doesn't work
# equivalent of `if ( ($x =~ m/\./) && ($z =~ m/\./)) {
say 'chained regex works.';
} else {
say 'no chained regex.';
}
Run Code Online (Sandbox Code Playgroud)
如何正确地使用正则表达式进行链式比较?
虽然100 <= $x < 200有明显的意义,A =~ B =~ C但没有。哪些操作数应该是字符串?其中哪些应该是匹配运算符?应该进行什么操作?
你建议在决赛的 RHS 上放一个字符串=~来匹配它,但这根本不是这样的=~;字符串始终在 LHS 上。$s =~ /a/ =~ /b/可能有道理,但仍然不明显会做什么,特别是如果有捕获。因此,这不受支持。
如果您想链接一些匹配项,可以使用以下选项:
all { $s =~ $_ } qr/a/, qr/b/
any { $s =~ $_ } qr/a/, qr/b/
none { $s =~ $_ } qr/a/, qr/b/
notall { $s =~ $_ } qr/a/, qr/b/
all { /a/ } $s1, $s2
any { /a/ } $s1, $s2
none { /a/ } $s1, $s2
notall { /a/ } $s1, $s2
Run Code Online (Sandbox Code Playgroud)
这些功能由核心模块List::Util 提供。
请注意,Perl 的“链接”更像是一个宏(就我个人而言,我认为基本上重新排列代码的“语法”功能是大危险信号):
\n$x OP1 $y OP2 $z\nRun Code Online (Sandbox Code Playgroud)\n这实际上被重写为类似这样的内容(考虑了一些其他细节,但这里不重要):
\n$x OP1 $y and $y OP2 $z\nRun Code Online (Sandbox Code Playgroud)\n这仅适用于某些进行比较的运算符\xe2\x80\x94。
\n考虑一下如果这个宏起作用的话,它会对此做什么:
\n$x =~ m/\\./ =~ $z\nRun Code Online (Sandbox Code Playgroud)\n这种转变为您提供:
\n$x =~ m/\\./ and m/\\./ =~ $z\nRun Code Online (Sandbox Code Playgroud)\n也就是说,中间的东西在第一个操作中位于右侧,然后在第二个操作中位于左侧。$x将连接到匹配运算符,然后匹配运算符的结果将绑定到$z,我猜这必须是预编译的模式。
ikegami 已经表明你实际上并没有链接东西。你想连续测试一些东西。
\n我通常反对这个特性,但它很快就被引入到 Perl 中,没有经过一个实验周期。在我提出的一个相关的 Github 问题中,人们来来回回地思考它(但请注意,对我的评论的反应数量相当高,这会让人们感到困惑,但实际上被忽略了)。在Perl 5 线程中中,有些人认为人们会感到困惑,而有些人则认为这是不可能的。第二组获胜。
\n直到我写了Chain Comparisons to避免过度打字,以及Reddit 上的第一条评论之后,我才对此感到困惑或反对。。
\n但我们到了。
\n我的建议是不要使用链式比较。即使文档是正确的,该功能也会让普通用户感到困惑。它的行为并不像他们想要的那样。人们倾向于根据他们所了解的其他知识来猜测编程语言会做什么。他们不是仅仅检查每一个案例,而是凭直觉(有时是错误的)知道某件事将如何或应该如何运作。
\n