Обнаружено пустое слово там, где оператор ожидал ошибки в сценарии Perl - PullRequest
2 голосов
/ 10 июля 2020

У меня есть сценарий, который отлично работает в моей локальной системе (Cygwin в Windows 10).

Но когда я запускаю его на 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);

Я извлекаю имена узлов из результирующих данных сценария оболочки с помощью регулярного выражения. Но почему он показывает ошибку, когда я запускаю его в среде Linux?

Ответы [ 2 ]

7 голосов
/ 10 июля 2020
my $result = $var =~ s/$regex/$1,/rg;

У меня нет старой версии perl для тестирования, но модификатор r был добавлен в 5.14. Если вы используете 5.10, держу пари, что это причина ошибки, которую вы видите, и это объясняет, почему он отлично работает в более новых версиях. Perl 5.10 был выпущен в декабре 2007 года - с тех пор было много работы. Я бы обновил, если можете, возможно, используя perlbrew.

Но пока ... r возвращает новую копию преобразованной строки, вместо изменения той, к которой привязано регулярное выражение . Так что вы можете попробовать что-нибудь вроде

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

в качестве обходного пути.

1 голос
/ 10 июля 2020

Функция / r (неразрушающая замена), которую вы используете в строке 22 * ​​1001 *

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

, была введена в Perl 5.14.0: perl5140delta .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...