2011-01-02 13 views
2

データベースからシリアル化されたphpデータを取り出し、シリアル化解除し、データを変更してから再びシリアル化するperlスクリプトがあります。データのシリアライズ/デシリアライズと変更

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') 
    ]; 

UPDATE: 私は何をしたいの(以下に示すように)名前&ペットのフィールドを変更が、それらを修正するために、個々のフィールドにアクセスする方法を見つけ出すことはできませんですThxからHugmeirまで、次のようなことがありますが、これはうまくいくようです。私はインデックス番号を知らない場合、これは '名前'を変更するための最良の方法ですか?

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

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

} 
+1

メアリーをジェーンに変更したい場合は、$ hashref - > {name} eq 'Mary'';パターンマッチでもMaryjoまたはRoseMaryがJaneに変わります。 – ysth

答えて

1

これはハッシュリファレンスではありません。ハッシュリファレンス*という2つの要素を保持する配列参照です。これはPHP ::シリアル化のカプセル化を破るが、トリックを行う必要があります。

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. 
} 

EDIT:あなただけ、たとえば、最初の要素を変更したい場合は、あなたが

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

を行うことができます*技術的には2つのハッシュリファレンスPHP :: Serializationオブジェクトに恵まれています。

+1

PHP ::シリアライゼーションにはカプセル化がありません。 phpオブジェクトを "PHP :: Serialization :: Object ::"に続けてPHPオブジェクト名を付け加えるだけです(ただし、接頭辞はデコード/非直列化呼び出しで変更できます)。そのような実際のPerlクラスはありません。 – ysth

+1

'$ array_ref - > [0] {name}'も動作します。貴重なhttp://perlmonks.org/?node=References+quick+reference – ysth

+0

thxをご覧ください。あなたの提案はうまくいきます。インデックス番号がわからない場合は、どうすれば 'Jane'を更新できますか?私はそれを持っていると信じていますが、より良い解決策がありますか? (上記の私の試みを見てください)。 –

関連する問題