сериализация / десериализация и изменение данных - PullRequest
2 голосов
/ 02 января 2011

У меня есть скрипт perl, который извлекает сериализованные данные php из базы данных, десериализует их, модифицирует данные, а затем снова сериализует. Я хотел бы изменить поля имени и питомца (как указано ниже), но не могу понять, как получить доступ к отдельным полям, чтобы изменить их:

use PHP::Serialization qw(serialize unserialize);
use Data::Dumper qw(Dumper); 

###blah, blah, blah
while ( @a = $sth->fetchrow() ){
my $hashref = unserialize( $a[0] );
print Dumper($hashref); 
}
ВЫХОД:
$VAR1 = [
      bless( {
               'name' => 'Fred', # I want this to be Dave
               'pet' => 'Cat',  # I want this to be Dog
               'date' => '1977'
             }, 'PHP::Serialization::Object::stdClass' ),
      bless( {
              'name' => 'Mary', # I want this to be Jane
               'pet' => 'Worm', # I want this to be Pig
               'date' => '1977'
             }, 'PHP::Serialization::Object::stdClass' )
    ];

UPDATE: Спасибо Hugmeir, у меня есть следующее, которое, кажется, работает. Это лучший способ изменить имя, если я не знаю номер индекса?

for my $hashref (@{$array_ref}) {

        if ( $hashref->{name} =~ /Mary/ ){
          $hashref->{name} = 'Jane'; 
         }

}

1 Ответ

1 голос
/ 02 января 2011

Для начала, это не hashref - это arrayref, который содержит два элемента, каждый из которых hashref *.Это нарушает инкапсуляцию PHP :: Serialization, но должно сработать:

my $array_ref = unserialize( $a[0] );

for my $hashref (@{$array_ref}) {
    @{$hashref}{qw(name pet)} = ('New name', 'New Pet');
    #Or $hashref->{name} = 'new name'; If you don't like slices.
}

РЕДАКТИРОВАТЬ: Если вы хотите изменить, скажем, первый элемент, вы можете сделать

$array_ref->[0]->{name} = 'etc';

* Технически два хешфайза благословлены PHP :: объектами сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...