序列化/反序列化&修改数据

时间:2011-01-02 19:33:44

标签: perl

我有一个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); 
}
OUTPUT:
$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' )
    ];

更新: 对Hugmeir来说,我有以下内容,这似乎有效。如果我不知道索引号,这是更改“名称”的最佳方法吗?

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

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

}

1 个答案:

答案 0 :(得分:1)

对于初学者来说,这不是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 :: Serialization对象有兴趣的hashref。