#perl
#perl
Вопрос:
У меня есть следующие модули Perl, все в одном файле —
заполнить:
sub __populate {
my $self = shift;
my $sth = $self->{dbh}->prepare("select prefid, value, others_posts from user_preferences where userid=?");
$sth->execute($self->userid);
while(my $href = $sth->fetchrow_hashref()) {
$self->value($href->{PREFID}, $href->{VALUE}, $href->{OTHERS_POSTS});
}
$sth->finish();
}
Обновить:
sub update {
my $self = shift;
my $sth = $self->{dbh}->prepare("delete from user_preferences where userid=?");
$sth->execute($self->userid);
$sth->finish;
$sth = $self->{dbh}->prepare("insert into user_preferences(userid, prefid, value, others_posts ) values(?, ?, ?, ?)");
while(my ($prefid, $value, $others_posts) = each %{$self->{PREFS}}) {
$sth->execute($self->userid, $prefid, $value, 'true');
}
$sth->finish;
}
и значение:
sub value {
my $self = shift;
my $prefid = shift;
$self->{PREFS}->{$prefid} = shift if(@_);
return $self->{PREFS}->{$prefid};
}
Первоначально это было просто PREFID
и VALUE
, но я только что добавил OTHERS_POSTS
в populate
update
подразделы and . Проблема в том, что, похоже, он ничего не возвращает для OTHERS_POSTS
того, что я только что добавил. При каждом запуске скрипта значения для OTHERS_POSTS
не вставляются в таблицу. Я думаю, что проблема заключается в моем value
подразделении, но я новичок в Perl и не знаю, как его изменить, чтобы OTHERS_POSTS
извлекалось значение.
Ответ №1:
Проблема в том, что вы изменили каждое предпочтение с простой пары ключ / значение (prefid / value) на каждый ключ, имеющий два значения (value amp; othersposts). Необходимо соответствующим образом изменить структуру данных, чтобы поддержать это.
Таким образом, для каждого префиксного ключа требуется хэш, содержащий записи VALUE amp; OTHERPOSTS с соответствующими значениями.
Изменения для этого:
sub update {
my $self = shift;
my $sth = $self->{dbh}->prepare("delete from user_preferences where userid=?");
$sth->execute($self->userid);
$sth->finish;
$sth = $self->{dbh}->prepare("insert into user_preferences(userid, prefid, value, others_posts ) values(?, ?, ?, ?)");
while(my ($prefid, $pref) = each %{$self->{PREFS}}) {
$sth->execute($self->userid, $prefid, $pref->{VALUE}, $pref->{OTHERSPOSTS});
}
$sth->finish;
}
sub value {
my ($self,$prefid,$value,$othersposts) = @_;
$self->{PREFS}->{$prefid} = { VALUE => $value ,
OTHERSPOSTS => $othersposts };
return $self->{PREFS}->{$prefid};
}
__populate() не нуждается в изменении, поскольку вы уже передаете дополнительный параметр в value()
Не удалось запустить это, поэтому могут быть некоторые ошибки syntex, но, надеюсь, вы поняли идею.
Ответ №2:
$self->{PREFS}
это хэш, который изначально имел prefid => value
пары.
если вы хотите сохранить value
и other_posts
в этом хэше изменить:
sub value {
my ($self,$prefid,$value,$otherposts) = @_;
# set
if( ! defined($value)) {
$self->{PREFS}->{$prefid} = "$value|$otherposts";
}
return $self->{PREFS}->{$prefid};
}
новая версия обновления:
sub update {
my $self = shift;
my $sth = $self->{dbh}->prepare("delete from user_preferences where userid=?");
$sth->execute($self->userid);
$sth->finish;
$sth = $self->{dbh}->prepare("insert into user_preferences(userid, prefid, value, others_posts ) values(?, ?, ?, ?)");
for my $prefid (keys %{$self->{PREFS}}) {
my ($value,$others_posts) = split '|', $self->{PREFS}->{$prefid};
$sth->execute($self->userid, $prefid, $value, $others_posts);
}
$sth->finish;
}
Комментарии:
1. Извините, я очень наглядный ученик и довольно новичок в Perl. Не могли бы вы привести пример?