v5.10中的Perl $AUTOLOAD评估显示“在操作符预期的位置找到了Barewword”...但v5.26运行良好

eh57zj3b  于 2022-11-24  发布在  Perl
关注(0)|答案(2)|浏览(135)

我用的是@ikegami的文章中的一个AUTOLOAD例子。我的RF::Component::Multi模块最近的一个CPAN testers report说:

Bareword found where operator expected at .../RF/Component/Multi.pm line 102, near "s/^.*:://sr"
syntax error at .../RF/Component/Multi.pm line 102, near "s/^.*:://sr"

代码如下所示,在GitHub上。

  • Perl 5.10不喜欢什么?
  • 这里是否隐藏了一个需要〉5.10的Perl特性,而我没有看到?(我的Perl 5.26.3正在工作)
  • 如果是这样的话,它能变得更向后兼容吗?怎么做?
  • 如果没有,我在哪里可以找到版本,这样我就可以做正确的use 5.xx
  • 我需要use vars '$AUTOLOAD'吗?
# Thanks @ikegami:
# https://stackoverflow.com/a/74229589/14055985
sub AUTOLOAD
{
    my $method_name = our $AUTOLOAD =~ s/^.*:://sr;

    my $method = sub {
        my $self = shift;
        return [ map { $_->$method_name(@_) } @$self ];
    };

    {
        no strict 'refs';
        *$method_name = $method;
    }

    goto &$method;
}
ni65a41a

ni65a41a1#

您可以使用Perl::MinimumVersion来回答这样的问题。

$ perlver your-code.pl

   --------------------------------------
 | file   | explicit | syntax  | external |
 | -------------------------------------- |
 | minver | ~        | v5.13.2 | n/a      |
 | -------------------------------------- |
 | Minimum explicit version : ~           |
 | Minimum syntax version   : v5.13.2     |
 | Minimum version of perl  : v5.13.2     |
   --------------------------------------

有关更多详细信息,

$ perlver --blame your-code.pl

 ------------------------------------------------------------
 File    : minver
 Line    : 3
 Char    : 40
 Rule    : _regex
 Version : 5.013002
 ------------------------------------------------------------
 s/^.*:://sr
 ------------------------------------------------------------
svgewumm

svgewumm2#

在5.14中添加了s///r

my $method_name = our $AUTOLOAD =~ s/^.*:://sr;

可替换为

( my $method_name = our $AUTOLOAD ) =~ s/^.*:://s;

相关问题