我有一个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';
}
}
答案 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。