【问题标题】:Syntax compilation problems with Smart Match in Perl?Perl 中智能匹配的语法编译问题?
【发布时间】:2014-06-26 01:57:21
【问题描述】:

我似乎在用旧版本的 perl 编译我的 perl 脚本时遇到问题,我希望有人能帮助我。我最初编写和编译 perl 文件时没有出现问题的系统是使用 perl v5.16.3,我现在正在尝试编译和运行它的系统是使用 perl v5.8.5,我认为这就是问题所在。我知道在 v5.10 中对 ~~ 的使用方式进行了很多更改。 v5.10 是第一个实际使用 ~~ 运算符的版本吗?

以下是我遇到语法错误的代码:

if (/$SEARCH/x ~~ @{$pids{$mPID}{$key}}){

这是我得到的错误:

syntax error at /sysadm/shared/ftp_search.pl line 310, near "/$SEARCH/x ~"
syntax error at /sysadm/shared/ftp_search.pl line 310, near "})"

这是周围的代码,因此您可以更好地了解正在发生的事情:

 foreach my $mPID (keys %pids){
    foreach my $key (keys %{$pids{$mPID}}){
        if (/$SEARCH/x ~~ @{$pids{$mPID}{$key}}){
        } else {
            delete $pids{$mPID}{$key};
        }
    }
}

所以基本上,我有一个散列散列,基本上如果语句最终不匹配,它将从散列中删除它。我正在努力尝试升级服务器上的 perl,但仍在尝试获得批准。我是否正确假设这是由于使用了 perl 版本?

谢谢。

【问题讨论】:

  • 引用the doc,'首先在 Perl 5.10.1 中可用(5.10.0 版本的行为不同),二进制 ~~ 在其参数之间进行“智能匹配”。
  • 你能解释一下你想让智能匹配做什么吗?
  • 不管怎样,如果你有很多依赖智能匹配的代码,并且需要将其反向移植到 Perl 5.8.x,请查看 match::smart — 我的重新可用于 Perl 5.8.1 及更高版本的智能匹配的匹配算法(但不是其语法)的实现。还有match::simple,它提供了一个更简单的匹配算法,并有一个可选的XS 后端。在将字符串与字符串数组匹配的情况下,match::simple XS 后端的基准测试实际上比 Perl 的内置智能匹配更快!
  • 太棒了!谢谢@tobyink!

标签: perl hash syntax smartmatch


【解决方案1】:

智能匹配运算符是在 5.10.0 中添加的,在任何以前的 perl 版本中都不起作用。 (perl 5.10.0 change log )

附带说明,该运算符自 5.18.0 以来已被归类为“实验性”,不建议依赖它。 (5.18.0 change log)。

智能匹配,在 v5.10.0 中添加并在 v5.10.1 中进行了重大修改, 一直是投诉的常态。虽然有很多 它有用的方式,它也被证明是有问题的,并且 Perl 的用户和实现者都感到困惑。有过一个 关于如何最好地解决问题的建议数量。很明显 smartmatch 几乎肯定会改变或消失 在将来。不建议依赖其当前行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多