regex - Bareword 在 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环境中运行它时会显示错误?
解决方案
my $result = $var =~ s/$regex/$1,/rg;
我没有旧的 perl 版本来测试,但r
修改器是在 5.14 中添加的。如果您使用的是 5.10,我敢打赌这就是您看到的错误的原因 - 它可以解释为什么它在较新的版本上运行良好。Perl 5.10 于 2007 年 12 月发布 - 从那时起已经做了很多工作。如果可以的话,我会升级,可能使用perlbrew
.
但与此同时...r
返回转换后的字符串的新副本,而不是更改正则表达式绑定的那个。所以你可以尝试类似
my $result = $var;
$result =~ s/$regex/$1,/g;
作为一种解决方法。
推荐阅读
- c# - Botbuilder 自适应对话框存储用户输入
- node.js - 如何覆盖@hapi/joi 中的错误消息?
- r - 如何使用 shell 将数组从 VBA 传递到 R
- javascript - 评估JavaScript swift nil
- r - 如何在R中以字符串为条件创建变量
- javascript - 使用 Node 执行 js 代码时出错:“$.ajax 不是函数”
- azure - Azure Repos REST API 以获取合并请求中已更改文件的列表
- curl - 请求中的 CloudFlare 强制数据中心位置
- angular - 如何在超时值后阻止角度 websocket 连接打开
- bash - 排除多个文件夹 (bash)