Сценарий Perl не может получить значение флажка

#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. Не могли бы вы привести пример?