Как я могу вставить хеш-значения в столбцы с помощью Perl DBI?

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

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

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

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

@values ​​определяется так же, как этот вопрос, т.е.

my @values = values %hash;

Изменить: структура БД:

T1:

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 опорных значений вставляются.

РЕДАКТИРОВАТЬ:

_ ВЫВОД _

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

_ КОД _ вот как я вставляю значения в %hash

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++;
}

person birdy    schedule 30.11.2009    source источник
comment
Все ответы на этот вопрос верны. Вам действительно нужна помощь в обновлении базы данных или вам нужна помощь в работе со стандартными структурами данных Perl?   -  person innaM    schedule 30.11.2009
comment
@Manni: Если ответы верны, то почему эталонные значения загружаются в БД вместо фактических значений?   -  person birdy    schedule 30.11.2009
comment
Покажите нам какой-нибудь код: хотя бы оператор sql и оператор execute. А затем расскажите нам о своей базе данных. Теперь у нас есть идея, как вы хотите, чтобы эти значения попали в вашу базу данных. Обозначают ли ключи строки, столбцы или ни то, ни другое?   -  person innaM    schedule 30.11.2009
comment
Показать вывод print Dumper \@values   -  person Sinan Ünür    schedule 01.12.2009
comment
Можем ли мы увидеть больше вашего кода, пожалуйста? Похоже, где-то есть простая ошибка, тем более что вы, очевидно, пробовали три разных допустимых способа сделать это. Простые опечатки временами приводили меня в большое недоумение.   -  person Christopher Bottoms    schedule 01.12.2009
comment
Вставка данных в хеш, похоже, не имеет ничего общего с вашим первоначальным созданием хеша. Почему вы так не хотите показывать нам свой код?   -  person Christopher Bottoms    schedule 01.12.2009
comment
я показал весь код здесь. мой код создает хэши, а затем вставляет их значения в базы данных, и это именно то, что я показал здесь.   -  person birdy    schedule 01.12.2009
comment
Тогда откуда взялись хеш-ключи $a и $x?   -  person Christopher Bottoms    schedule 01.12.2009
comment
$x — это просто переменная, определенная как $x=0; Я исправил код.   -  person birdy    schedule 01.12.2009


Ответы (3)


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

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

perldoc perlreftut

чтобы получить доступ к этому уроку)

person David Harris    schedule 30.11.2009

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

my $key;
my $value;
while (($key, $value) = each %hash) {
    $sth->bind_param(1, $key);
    $sth->bind_param(2, $value);
    $sth->execute();
}
person David Harris    schedule 30.11.2009
comment
Гораздо лучше записать этот цикл как while( my ( $key, $value ) = each %hash ) - person friedo; 01.12.2009
comment
нет, по-прежнему ссылка загружается вместо фактических значений. - person birdy; 01.12.2009
comment
Выведите $key и $value в цикле, чтобы убедиться, что значения, полученные из хеша, верны. - person David Harris; 01.12.2009
comment
Также обратите внимание, что я использую execute, а не execute_array. - person David Harris; 01.12.2009
comment
$key правильный, но $value печатается как эталонное значение, т. е. ARRAY (0x949f6b0). Что происходит не так? - person birdy; 01.12.2009
comment
К вашему сведению, авторитетная ссылка на Perl DBI находится по адресу ‹a href=search.cpan.org. /~timb/DBI/DBI.pm› ‹/a› - person David Harris; 01.12.2009
comment
@birdy: у вас есть хэш массивов. - person friedo; 01.12.2009
comment
к вашему сведению ‹code› #!/bin/perl use strict; использовать предупреждения; my %hash = ( 1 =› 'Первое слово', 2 =› 'Второе слово верно', 0 =› 'Третье слово не существует', ); мой ключ $; мое значение $; while (my ($key, $value) = каждый %хеш) { print (key: ›$key‹ value: ›$value‹\n); } ‹/code› создает ключ ‹code›: ›1‹ значение: ›Первое слово‹ ключ: ›0‹ значение: ›Третье слово не существует‹ ключ: ›2‹ значение: ›Второе слово верно‹ ‹/code › под cygwin и perl 5.10.0 - person David Harris; 01.12.2009

ОБНОВЛЕНИЕ:

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


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

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

person Christopher Bottoms    schedule 30.11.2009
comment
он работает, но, как я уже упоминал, он загружает справочные значения вместо фактических значений. - person birdy; 01.12.2009
comment
я добавил еще часть своего кода. добавлено, как я создаю %hash - person birdy; 01.12.2009