Bareword在Perl脚本中的Error处发现了运算符的预期位置

时间:2020-07-10 07:45:14

标签: regex linux perl

我有一个在本地系统(Windows 10中为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);

我正在使用正则表达式从shell脚本结果数据中提取节点名称。但是为什么在Linux环境中运行它时却显示错误?

2 个答案:

答案 0 :(得分:7)

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

我没有要测试的perl版本,但是在{5.14}中添加了r修饰符。如果您使用的是5.10,我敢打赌这就是您所看到的错误的原因-它可以解释为什么它在较新版本上仍然可以正常工作。 Perl 5.10于2007年12月发布-自那时以来,已经进行了大量工作。如果可以的话,我会升级,可能使用perlbrew

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

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

作为解决方法。

答案 1 :(得分:1)

您在第22行中使用的/ r功能(非破坏性替换)

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

是在Perl 5.14.0中引入的:perl5140delta

相关问题