我刚刚升级到Perl 5.26.1,现在我得到了
Smartmatch is experimental at check_tr.pl line 67.
有问题的代码是
my @patterns = (qr/summary:\s+(.+?) in\s+(.+?) - average of\s+(.+?)$/,
qr/summary:\s+(.+?) in\s+(.+) (.+? .+?)$/);
my $r = "";
opendir(DIR, $dir) or die $!;
while(my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
open(F, '<', "$dir/$file") or die $!;
if (<F> ~~ @patterns) {
$r .= <F>;
...
问题
理想情况下,对代码的更改尽可能少。我应该怎么做而不是智能匹配?
答案 0 :(得分:6)
说出你的意思。例如。如果要检查标题行是否与@patterns
中的任何正则表达式匹配:
use List::Util 'any';
...
my $line = <F>;
if (any { $line =~ $_ } @patterns) { ... }
虽然在这种情况下,预编译单个模式可能更为明智,例如:
my ($pattern) = map qr/$_/, join '|', @patterns;
...
if (<F> =~ $pattern) { ... }
如果您的@patterns
数组包含不同类型的数据,您可能需要选择其他匹配运算符,例如==
或eq
。如果@patterns
并非完全相同的“类型”并且您真的想要智能匹配行为,则可以使警告静音并继续使用它:
use experimental 'smartmatch';
但是,这可能会在未来没有进一步警告的情况下中断。
答案 1 :(得分:5)
Smartmatch实验的原因在于,如果不引用Docs,很难弄清楚它会做什么。即便如此,我们如何插入上述代码?
这是一个案例:
ARRAY1 ARRAY2 recurse on paired elements of ARRAY1 and ARRAY2[2]
like: (ARRAY1[0] ~~ ARRAY2[0])
&& (ARRAY1[1] ~~ ARRAY2[1]) && ...
我们假设<F>
在列表上下文中解释并在一次调用中清空?
或者这是一个案例:
Any ARRAY smartmatch each ARRAY element[3]
like: grep { Any ~~ $_ } ARRAY
我猜第二个。在这种情况下,文档上面的代码段为您提供了一个优秀(和更清晰)的编码替代方案。假定@patterns
包含正则表达式,您也可以将~~
替换为=~
。
如果您不喜欢文档中的grep
替代方案,我建议您查看List::Util
或List::MoreUtils
。两者都包含any
调用,该调用充当短路grep
。或者,如果您尝试实施ARRAY1 ARRAY2
选项,则后一个库包含可能提供的pairwise
调用。
答案 2 :(得分:0)
必须同意其他避免使用Perl的 smartmatch 的答案。
Perl-Monks网站上有替代品列表(包括示例):
PerlMonks - Smartmatch alternatives