Как передать хэш в саб? - PullRequest
       8

Как передать хэш в саб?

1 голос
/ 15 августа 2011

В моем Perl-скрипте я собираю данные и строю хэш-карту. Ключи hashmap представляют имена полей, а значения представляют значение, которое я хочу вставить в соответствующее поле.

Хэш-карта создается, а затем передается методу saveRecord (), который должен создать SQL-запрос, и в конечном итоге он его выполнит.

Идея в том, чтобы обновлять базу данных один раз, а не один раз для каждого поля (полей много).

Проблема: у меня проблемы с передачей хеш-карты в сабвуфер, а затем извлечения полей и значений из хеш-карты. На данный момент мои ключи и значения являются пустыми. Я подозреваю, что данные теряются во время передачи на сабвуфер.

Выходные данные скрипта указывают на отсутствие ключей и значений.

Нужна помощь в передаче данных в сабвуфер таким образом, чтобы я мог их развести, как показано на рисунке - с помощью join().

Спасибо!

Фрагмент кода:

for my $key (keys %oids) {
        $thisField = $key;
        $thisOID = $oids{$thisField};
        # print "loop: thisoid=$thisOID field=$thisField\n";

        # perform the SNMP query.
        $result = getOID ($thisOID);
        # extract the information from the result.
        $thisResult = $result->{$thisOID};

        # remove quotation marks from the data value, replace them with question marks.
        $thisResult =~ s/\"|\'|/\?/g;

        # TODO: instead of printing this information, pass it to a subroutine which writes it to the database (use an update statement).
        # printf "The $thisField for host '%s' is '%s'.\n", $session->hostname(), $result->{$thisOID};

        # add this key/value pair to the mydata hashmap.
        $mydata{$thisField} = $thisResult;

        # print "$thisField=$thisResult\n";
}


# write one record update for hashmap %mydata.
saveRecord (%mydata);


# write all fields to database at once...
sub saveRecord ($) {
        my $refToFields=shift;


        my @fieldlist = keys %$refToFields;
        my @valuelist = values %$refToFields;
        my $sql = sprintf ("INSERT INTO mytable (%s) VALUES (%s)",join(",",@fieldlist), join(",",@valuelist) );

        # Get ID of record with this MAC, if available, so we can perform SQL update
        my $recid = getidbymac ($MAC);

        print "sql=$sql\n";
    # TODO: use an insert or an update based on whether recid was available...
        # TODO: ID available, update the record
        # TODO: ID not available, insert record let ID be auto assigned.
}

1 Ответ

8 голосов
/ 15 августа 2011

Я немного почистил твой код. Ваша основная проблема не заключалась в использовании ссылки при вызове вашего саба. Также обратите внимание на закомментированное регулярное выражение, которое было убрано:

Код:

use strict;
use warnings;

# $thisResult =~ s/["']+/?/g;
my %mydata = ( 'field1' => 12, 'field2' => 34, );

saveRecord (\%mydata); # <-- Note the added backslash

sub saveRecord {
    my $ref = shift;
    my $sql = sprintf "INSERT INTO mytable (%s) VALUES (%s)",
        join(',', keys %$ref),
        join(',', values %$ref);
    print "sql=$sql\n";
}

Выход:

sql=INSERT INTO mytable (field1,field2) VALUES (12,34)
...