43

I'm trying to parse the Facebook Graph API JSON results, and I'm having a bit of trouble with it.

What I was hoping to do was print the number of shares:

my $trendsurl = "https://graph.facebook.com/?ids=http://www.filestube.com";
my $json;
{
  local $/; #enable slurp
  open my $fh, "<", $trendsurl;
  $json = <$fh>;
}

my $decoded_json = @{decode_json{shares}};
print $decoded_json;

2 Answers 2

122

Some of the code above is extremely puzzling. I've just rewritten it with annotations for you.

#!/usr/bin/perl

use LWP::Simple;                # From CPAN
use JSON qw( decode_json );     # From CPAN
use Data::Dumper;               # Perl core module
use strict;                     # Good practice
use warnings;                   # Good practice

my $trendsurl = "https://graph.facebook.com/?ids=http://www.filestube.com";

# open is for files.  unless you have a file called
# 'https://graph.facebook.com/?ids=http://www.filestube.com' in your
# local filesystem, this won't work.
#{
#  local $/; #enable slurp
#  open my $fh, "<", $trendsurl;
#  $json = <$fh>;
#}

# 'get' is exported by LWP::Simple; install LWP from CPAN unless you have it.
# You need it or something similar (HTTP::Tiny, maybe?) to get web pages.
my $json = get( $trendsurl );
die "Could not get $trendsurl!" unless defined $json;

# This next line isn't Perl.  don't know what you're going for.
#my $decoded_json = @{decode_json{shares}};

# Decode the entire JSON
my $decoded_json = decode_json( $json );

# you'll get this (it'll print out); comment this when done.
print Dumper $decoded_json;

# Access the shares like this:
print "Shares: ",
      $decoded_json->{'http://www.filestube.com'}{'shares'},
      "\n";

Run it and check the output. You can comment out the print Dumper $decoded_json; line when you understand what's going on.

Sign up to request clarification or add additional context in comments.

1 Comment

Great +1 response. I have not written much perl code in 15 years, so your thorough example really helped me get back up to speed on perl.
2

How about using CURL command instead? (P.S.: This is running on Windows; make CURL changes for Unix systems).

$curl=('C:\\Perl64\\bin\\curl.exe -s http://graph.facebook.com/?ids=http://www.filestube.com');
$exec=`$curl`;
print "Output is::: \n$exec\n\n";

# match the string "shares": in the CURL output
if ($exec=~/"shares":?/) { 
    print "Output is:\n$exec\n";

    # string after the match (any string on the right side of "shares":)
    $shares=$'; 

    # delete all non-Digit characters after the share number
    $shares=~s/(\D.*)//; 
    print "Number of Shares is: ".$shares."\n";
} else {
    print "No Share Information available.\n"
}

OUTPUT:

Output is:
{"http:\/\/www.msn.com":{"id":"http:\/\/www.msn.com","shares":331357,"comments":19}}
Number of Shares is: 331357

2 Comments

Using CURL is not exactly using perl.
I think it is the preferred way to disable default keep alive behaviour in lwp::simple

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.