0

Perl で php プロセスを再作成しようとしていますが、うまくいきません (Perl についてはよくわかりません)。

これは私のphpコードです:

$json = '{"0":{"name":"action","value":"none"},"1":{"name":"additionalTraining","value":"modulesRevisited"},"2":{"name":"additionalTrainingComments","value":""},"3":{"name":"additionalTraining","value":"moduleReporting"},"4":{"name":"additionalTrainingComments","value":""},"5":{"name":"additionalTrainingComments","value":""},"6":{"name":"anotherValue","value":""},"7":{"name":"1359436206","value":""},"8":{"name":"1359436207","value":""},"48":{"name":"actionId","value":""},"49":{"name":"multiSelect","value":"second"},"50":{"name":"multiSelect","value":"third"},"51":{"name":"radio","value":"1"},"52":{"name":"svgs","value":{"0":{"id":"drawing"},"1":{"id":"drawing"}}}}';
$decoded = json_decode($json,true);
$clean = array();
foreach($decoded as $Obj => $array){
    if(array_key_exists($array['name'], $clean))
    {
        if(!is_array($clean[$array['name']]))
        {
            $value = $clean[$array['name']];
            $clean[$array['name']] = array($value,$array['value']);
        }
        else
        {
            array_push($clean[$array['name']], $array['value']);
        }
    }
    else
    {
        $clean[$array['name']]=$array['value'];
    }
}
 echo json_encode($clean);

更新: これは私がPerlで試したことと、私がぶつかり続けている壁です:

use JSON;
use Data::Dumper;
use warnings;
use strict;
my @records = decode_json($json_text); 
foreach my $element (@records)
{
      print "$element\n";
}

ハッシュリファレンスを取得します。そこで、最初の行を次のように変更してみます。

my @records = @{ decode_json($json_text) }; #dereference function as it returns an arrayref, not a list

次に、ループしようとすると「配列参照ではありません」というメッセージが表示されます。

次に、次のようなことを試してみましたが、結果もエラーもありません。

my $records = decode_json($json_text); 
my $i = 0;
my @records;
foreach my $entry (@{$records[0]}) {
    my %listHash = %{$entry};
    my $key;
    my $value;
    $i++;
    while(($key, $value) = each(%listHash)) {   
        my $key;
        my $value;
        print "${key}_$i, $value\n";
    }
}

次に、それらすべてのビットを組み合わせて、私が求めている出力を取得しようとします。最も近いのは次のとおりです。

my %records = %{ decode_json($json_text) }; 
while ( my ($key, $value) = each %records )
{
  my $records;
  #print "key: $key, value: $records{$key}\n";
  while ( my ($key, $value) = each %{$value} )
  {
    print "key: $key, value: $value\n";
  }
}

しかし、これにより次のような出力が得られます。

key: name, value: anotherValue
key: value, value: third
key: name, value: multiSelect
key: value, value: moduleReporting

一方、次のような出力が必要です

key: anotherValue, value: third
key: multiSelect, value: moduleReporting

どこが間違っていますか?

Perl で同じ結果を再現するにはどうすればよいですか? よろしくお願いいたします。

4

1 に答える 1