You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Parallel::ForkManager在Perl 5.36中报Bareword错误,求兼容排查方案

Perl 5.36替换use strict为use 5.036后出现Bareword错误的原因及解决方法

问题情况

原本在Perl 5.36以下版本正常运行的脚本,仅将开头的use strict;等语句替换为use 5.036;后,执行时抛出错误:

Bareword found where operator expected at debug.pl line 20, near "new Parallel::ForkManager"

旧版本代码(Perl <5.36可用)

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';
use Parallel::ForkManager;

sub execute {
    my $command = shift;
    print "Executing Command: $command\n";
    if (system($command) != 0) {
        my $fail_filename = "$0.fail";
        print "$command failed.\n";
        die;
    }
}

sub run_parallel {
    my $cmd = shift;
    my $manager = new Parallel::ForkManager(2);
    foreach my $command (@{ $cmd }) {
        $manager->start and next;
        execute( $command );
        $manager->finish;
    }
    $manager->wait_all_children;#necessary after all lists
}

my @commands = ('echo "a"','echo "b"','echo "c"','which ls','which rm');
run_parallel(\@commands);

新版本代码(Perl 5.36报错)

#!/usr/bin/env perl

use 5.036;
use warnings FATAL => 'all';
use autodie ':all';
use Parallel::ForkManager;

sub execute {
    my $command = shift;
    print "Executing Command: $command\n";
    if (system($command) != 0) {
        my $fail_filename = "$0.fail";
        print "$command failed.\n";
        die;
    }
}

sub run_parallel {
    my $cmd = shift;
    my $manager = new Parallel::ForkManager(2);
    foreach my $command (@{ $cmd }) {
        $manager->start and next;
        execute( $command );
        $manager->finish;
    }
    $manager->wait_all_children;#necessary after all lists
}

my @commands = ('echo "a"','echo "b"','echo "c"','which ls','which rm');
run_parallel(\@commands);

原因及解决方法

这不是Parallel::ForkManager与Perl 5.36不兼容,而是代码中的旧式类构造写法在Perl 5.36的严格规则下被禁用:

  • 核心原因:use 5.036; 会自动启用strict和strictures 2的严格模式,其中明确禁止了间接对象语法(即new ClassName(...)这种写法);而旧版本里单独的use strict;并没有限制这种语法。
  • 修复方式:将旧式构造调用改为Perl面向对象的标准写法——直接调用类的new方法:
    把代码中的
    my $manager = new Parallel::ForkManager(2);
    
    替换为
    my $manager = Parallel::ForkManager->new(2);
    

这种写法不仅能解决报错,也是现代Perl推荐的编码规范,兼容性更强。

内容的提问来源于stack exchange,提问作者con

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:45:49