in reply to Re^2: SOAP::Lite and hash of hashes
in thread SOAP::Lite and hash of hashes

Ah sorry, that that was an object method didn't cross my mind. I probably can't really help you as I don't know Soap::Lite and I didn't find the search method in its documentation. But one thing is certain, your foreach is not right. It might be one of these:

foreach my $r (keys %$result){ print $r->result->{Person}->{commonname}; } foreach my $r ($result->result){ print $r->{Person}->{commonname}; } foreach my $r (@$result){ print $r->result->{Person}->{commonname}; }

If not, you might use Data::Dumper to check out the data structure of $result. Or look for an example in the documentation of the search method

The error message 'Can't coerce...' means there is an array somewhere and we access it as a hash. Data::Dumper is your friend here.

UPDATED

Replies are listed 'Best First'.
Re^4: SOAP::Lite and hash of hashes
by joec_ (Scribe) on Feb 12, 2009 at 15:55 UTC
    Hi, thanks for responding.
    foreach my $r (keys %$result){ print $r->result->{Person}->{commonname}; }
    gives Can't locate object method "result" via package "_content" (perhaps you forgot to load "_content"?) at ./searchPeople.pl
    foreach my $r ($result->result){ print $r->{Person}->{commonname}; }
    works for a unique item i.e. login id but gives the pseudo hash deprecated error and bad index error as above

    foreach my $r (@$result){ print $r->result->{Person}->{commonname}; }
    Gives 'not an ARRAY reference'.

    This is output from data dumper when the search method is given 'shaw', ive truncated a load of other data and other people for demo purposes:

    $VAR1 = { 'Person' => [ { 'commonname' => 'person 1', 'location' => 'location 1', 'telephonenumber' => '34567688', 'surname' => 'Shaw' }, { 'commonname' => 'person 2', 'location' => 'location 2', 'telephonenumber' => '1234576', 'surname' => 'Birkinshaw' }
    Looking at this then, is Person an array and not a hash? How would i get at each element of the person array if it is?

    The search method isnt part of the SOAP::Lite docs - its a web method from my webservice.

    Thanks

    Joe

    UPDATE I can get at the second person using

    print $result->result->{Person}[1]->{commonname};

    Now all i need is a loop...thanks

    -----

    Eschew obfuscation, espouse eludication!

      $result->result->{Person} is a reference to an array

      foreach my $r (@{$result->result->{Person}}){ print $r->{commonname}; }
        Thank you very much, it works!

        jethro++

        Joe

        -----

        Eschew obfuscation, espouse eludication!