Как я могу вставить значения хеша в столбцы с DBI Perl? - PullRequest
1 голос
/ 30 ноября 2009

У меня есть хэш, и я пытаюсь вставить его значения в базу данных. Хеш определяется следующим образом:

my %hash = (
            1   =>  'First Word',
            2   =>  'Second Word is correct',
            0   =>  'Third word does not exist',
            );

Я не знаю, как вставить значения в базу данных, используя хэши. Я заметил, что мой вопрос похож на этот вопрос. Но ни один из ответов не кажется правильным. При использовании любого из перечисленных ответов значения в хэше не вставляются, вместо этого вставляется ссылка на хэш, т.е. ARRAY(0x9e63b30). Но когда я print Dumper @values, значения печатаются, а не справочные значения.

Любые предложения о том, как вставить значения, а не их ссылку? И что не так в решениях, перечисленных в ответах на вопрос .

@ значения определены так же, как этот вопрос, т. Е.

my @values = values %hash;

Edit: Структура БД:

Т1:

sid  sentence
1    First Word
2    Second Word is correct
0    Third word does not exist

в приведенном выше sid - это keys хешей, а предложение - values хешей.

это то, что я опробовал (это один из ответов на вопрос ):

my @keys = keys %hash;

my @values = values %hash;

my $sth = $dbh->prepare("INSERT INTO T1(sid, sentence) VALUES (?,?);");

$sth->execute_array({},\@keys, \@values);

снова, при вставке @values вводятся опорные значения.

EDIT:

_ ВЫХОД _

$VAR1 = 'First Word';
$VAR2 = 'Third word does not exist';
$VAR3 = 'Second Word is correct';

_ КОД _ Вот как я вставляю значения в% хэш

my $x=0;
foreach my $file(@files){
        if ($file =~ /regex/){
                push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6 $7"); 
        }
        elsif ($file =~ /regex/){
                push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6");
        }
        elseif ($file =~ /Hs_(.+)_(.+)_(.+)_(.+)_(.+)_W.+txt/){
                push (@{$hash{$x}}, "$1 $2 $3 $4 $5");
        }
$x++;
}

Ответы [ 4 ]

2 голосов
/ 01 декабря 2009

Это не то, что вы изначально опубликовали !!! У вас есть хэш ссылки на массивы. Прочтите справочное руководство по perl (perlreftut), чтобы узнать о них.

(Используйте команду

perldoc perlreftut

для доступа к этому уроку)

0 голосов
/ 01 декабря 2009

Это должно работать.

my $key;
my $value;
while (($key, $value) = each %hash) {
    $sth->bind_param(1, $key);
    $sth->bind_param(2, $value);
    $sth->execute();
}
0 голосов
/ 01 декабря 2009

UPDATE:

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


Предыдущий ответ:

Мой ответ в другой теме , которая использует execute_array(), также работает, я проверил его перед публикацией.

0 голосов
/ 01 декабря 2009

Мой ответ на другой ветке , на которую вы ссылались на работы. Я проверял это и использовал это много раз. Он не использует execute_array (), просто execute ().

...