Regex Bareword在Perl脚本中的错误处找到了运算符预期的位置

Regex Bareword在Perl脚本中的错误处找到了运算符预期的位置,regex,linux,perl,Regex,Linux,Perl,我有一个脚本,在我的本地系统(Windows10中的Cygwin)中运行良好 但当我在Linux机器x86_64 GNU/Linux上运行相同的程序时,会显示以下错误: Bareword found where operator expected at script.pl line 22, near "s/$regex/$1,/rg" syntax error at script.pl line 22, near "s/$regex/$1,/rg" Exe

我有一个脚本,在我的本地系统(Windows10中的Cygwin)中运行良好

但当我在Linux机器x86_64 GNU/Linux上运行相同的程序时,会显示以下错误:

Bareword found where operator expected at script.pl line 22, near "s/$regex/$1,/rg"
syntax error at script.pl line 22, near "s/$regex/$1,/rg"
Execution of script.pl aborted due to compilation errors.
这是我的剧本:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $site_name    = $ARGV[0];
my $type_of_site = $ARGV[1];

chomp($site_name);
chomp($type_of_site);

my $var = `sh shell_script.sh $site_name $type_of_site`;
#The above shell script gives me following data in $var
#"Result data [[The Incident result is shown with Node and IP address. error.log warning.log http://10.0.0.11/home/node_data/2020-07-08_data.txt NODE IP NODE1 10.0.0.1 NODE2 10.0.0.2 NODE3 10.0.0.3 NODE4 10.0.0.4 NODE5 10.0.0.5 ]]";

print $var;

my $regex = qr/.*?(?P<Node>\w+)\s(?:(?:\d{1,3}\.){3}\d{1,3}) ?]?]?/mp;

my $result = $var =~ s/$regex/$1,/rg;

chop $result;

my @nodes_list = split /,/, $result;

print Dumper(\@nodes_list);
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的$site_name=$ARGV[0];
我的$type_of_站点=$ARGV[1];
chomp($site_name);
chomp(现场类型);
my$var=`sh shell_script.sh$site_name$type_of_site`;
#上面的shell脚本以$var形式提供了以下数据
#“结果数据[[事件结果与节点和IP地址一起显示。error.log warning.loghttp://10.0.0.11/home/node_data/2020-07-08_data.txt 节点IP节点1 10.0.0.1节点2 10.0.0.2节点3 10.0.0.3节点4 10.0.0.4节点5 10.0.0.5]”;
打印$var;
my$regex=qr/*?(?P\w+)\s(?:(?:\d{1,3}\){3}\d{1,3})?]?]?/mp;
我的$result=$var=~s/$regex/$1,/rg;
印章$结果;
my@nodes\u list=split/,/,$result;
打印转储程序(\@nodes\u列表);
我使用regex从shell脚本结果数据中提取节点名。但为什么在Linux环境下运行时会显示错误?

第22行中使用的/r功能(无损替换)

my $result = $var =~ s/$regex/$1,/rg;
已在Perl 5.14.0中引入:

我没有那么旧的perl版本可供测试,但在5.14中添加了
r
修饰符。如果您使用的是5.10,我敢打赌这就是您看到的错误的原因——这将解释为什么它在新版本上运行良好。Perl5.10于2007年12月发布——从那时起,已经做了很多工作。如果可以,我会升级,可能会使用
perlbrew

但与此同时
r
返回转换字符串的新副本,而不是更改正则表达式绑定到的副本。所以你可以试试类似的东西

my $result = $var;
$result =~ s/$regex/$1,/g;

作为解决办法。

1)所示代码中的哪一行是实际脚本中的“第22行”?2) 两个系统上的Perl版本是什么?1)在第22行,我有
my$result=$var=~s/$regex/$1,/rg。2) 在Linux中,我有
PerlV5.10.1
和windows
PerlV5.30.0
。在Ubuntu上使用Perl5.30对我来说效果很好。您可以尝试更新版本的perl吗?同样在v5.16(CentOS7)上,这些正则表达式没有语法错误。我看不出有什么可能是语法错误?(顺便说一句,你不能在任何地方使用这个名称
Node
,比如
$+{Node}
或者诸如此类的…或者你呢?)或者,在一行中:
(我的$result=$var)=~s/$regex/$1,/g
感谢@Shawn的澄清。更好的解决方案是升级您的
perl
。我不应该使用11年前的Perl版本!Cygwin提供了5.30.3
my $result = $var;
$result =~ s/$regex/$1,/g;