Как указано в комментариях, у вашего кода есть несколько проблем.Я не уверен, что следующее решит вашу проблему, но, по крайней мере, у него нет ни одной из упомянутых проблем.
Кстати: я сделал обоснованное предположение, основываясь на вашем регулярном выражении, что столбец AdditionalText
на самом деле содержит строку JSON.Тогда вам следует использовать анализатор JSON вместо применения регулярного выражения.
#!/usr/bin/perl
use strict;
use warnings;
use JSON qw(decode_json);
# DB setup etc.
use DBI....
my $dbh = ...
...
# Query for alert status
my $query_sth = $dbh->prepare(
q(SELECT AlertKey,AdditionalText,Identifier FROM alerts.status where AdditionalText like 'priority' AND Summary like 'Uplink' AND Type=1)
);
# Update AlertKey
my $update_sth = $dbh->prepare(
q(UPDATE alerts.status SET AlertKey=? WHERE Identifier=?)
);
# Execute query
$query_sth->execute()
or die "SQL Error: couldn't execute $DBI::errstr\n";
# Loop over results
foreach my $row ($query_sth->fetchrow_arrayref) {
my($key, $text, $id) = @{ $row };
my $data;
# Educated guess: $text is actually a JSON string
eval {
$data = decode_json($text);
};
if ($@) {
# handle JSON parse errors here...
next;
}
my $link = $data->{link_index};
unless ($link) {
# handle missing link index here...
next;
}
# update alert key
my $alert = "Port ${link} Circuit Up down";
$update_sth->execute($alert, $id)
or die "SQL Error: couldn't update $DBI::errstr\n";
}
Альтернатива без использования JSON
ПРИМЕЧАНИЕ: это не рекомендуется ,Если у вас есть JSON, XML, CSV, что угодно ...: всегда используйте парсер и работайте в "разобранном" домене.
my($key, $text, $id) = @{ $row };
# NOTE: regex might be incorrect if JSON property "link_index"
# is actually a number, not a string (see following line)
my($link) = ($text =~ /"link_index":\s*"(\d+)"/;
# = ($text =~ /"link_index":\s*(\d+)/;
unless ($link) {
# handle missing link index here...
next;
}