in reply to Re^2: Parsing Array of arrays from json file
in thread Parsing Array of arrays from json file

> The Dump of @records is:

unlikely, maybe a dump of \@records ?

In any case it looks like you got the nesting levels wrong, please try

 my @records = $decoded_json[0][0];

or

 my @records = $decoded_json[0][0][0];

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^4: Parsing Array of arrays from json file
by Anonymous Monk on Sep 12, 2021 at 11:06 UTC

    Dereferencing did the trick! Thank you

Re^4: Parsing Array of arrays from json file
by Anonymous Monk on Sep 12, 2021 at 10:32 UTC

    right, Dump was of \@records.

    Both your fixes return the following errors:

    Can't use string ("Sciences | ") as an ARRAY ref while "strict refs" in use at test.pl line 24.

    By the way, the code snippet runs without the need of any credentials, if this may help.

      Now I was able to run it:

      Based on Re^5: Parsing Array of arrays from json file this seems to "work":

      (FWIW I'm not happy with the code though, YMMV)

      use strict; use warnings; use Data::Dumper; use LWP::UserAgent; use JSON::PP; my $ua = LWP::UserAgent->new( ); $ua->agent("Mozilla"); my $segment = "Science | Research | Artificial Intelligence"; my $url='https://translate.googleapis.com/translate_a/single?client=gt +x&sl=en&tl=fr&dt=t&q=' . $segment; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); if ($res->is_success) { my $json_text= $res->content; #warn Dumper my $decoded_json = decode_json( $json_text ); my @decoded_json=@$decoded_json; my @records = @{$decoded_json[0]}; # <-- fixed derefrencing #warn Dumper \@records; foreach my $record (@records) { print Dumper $record; print "Translation for @$record[1] is @$record[0]\n"; } } else { print "\nError connecting to server\n"; }

      OUTPUT

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery

        > (FWIW I'm not happy with the code though, YMMV)

        here a cleaned up version, I prefixed all array_refs with a_ for clarity:

        use strict; use warnings; use Data::Dumper; use LWP::UserAgent; use JSON::PP; my $ua = LWP::UserAgent->new( ); $ua->agent("Mozilla"); my $segment = "Science | Research | Artificial Intelligence"; my $url='https://translate.googleapis.com/translate_a/single?client=gt +x&sl=en&tl=fr&dt=t&q=' . $segment; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); if ($res->is_success) { my $json_text = $res->content; my $a_decoded_json = decode_json( $json_text ); my $a_records = $a_decoded_json->[0]; foreach my $a_record (@$a_records) { print "Translation for $a_record->[1] is $a_record->[0]\n"; } } else { print "\nError connecting to server\n"; }

        OUTPUT

        -*- mode: compilation; default-directory: "d:/tmp/pm/" -*- Compilation started at Sun Sep 12 13:15:11 C:/Strawberry/perl/bin\perl.exe -w d:/tmp/pm/google_translate.pl Translation for Science | is Sciences | Translation for Research | is Recherche | Translation for Artificial Intelligence is Intelligence artificielle Compilation finished at Sun Sep 12 13:15:12

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

      Your code is confusing because you are reusing the same symbol names.

      I can't test because I'm on mobile now.

      Please note that this

      my @records = $decoded_json[0];

      Will create an array with just one entry, you may want try

      my @records = @{$decoded_json[0]};
      Plus correct nesting levels.

      I could help better if the dump and code was clearer...

      Cheers Rolf
      (addicted to the Perl Programming Language :)
      Wikisyntax for the Monastery