Perl解码,用于循环,&下载

时间:2013-07-17 09:39:53

标签: perl

我写了这个脚本,但我不确定它是否正确。

我想要做的是通过读取JSON文件的内容,对其进行解码以及将每个项目循环为$item来处理JSON文件。具有定义为$items[$i]['paper_item_id']的ID的特定URL的内容将使用该ID保存到定义的目标中。

但代码似乎没有起作用。我不确定我哪里出错了,但任何改进代码并使其工作的帮助或技巧都会很好。

我不是要求你做这个工作,只是需要帮助看看我出错的地方并为我纠正。

脚本应该基本上解码JSON,然后使用ID将swf文件从某个目录URL下载到我的PC上的目录。

这是代码

use LWP::Simple;

$items = 'paper_items.json';
my $s = $items or die;
$dcode = decode_json($items);

for ($i = 0 ; $i < $count ($items) ; $i++) {

  use File::Copy;

  $destination = "paper/";
  copy(
    "http://media1.clubpenguin.com/play/v2/content/global/clothing/paper/"
        . $items[$i]['paper_item_id'] . ".swf",
    $destination . $items[$i]['paper_item_id'] . ".swf"
  );

3 个答案:

答案 0 :(得分:2)

该计划可分为三个步骤:

  1. 获取JSON源。
  2. 解析JSON。
  3. 迭代解码的数据结构。我们期待一系列哈希。镜像文件由paper_item_id表示到工作目录。
  4. 我们将在此处使用LWP::Simple个功能。

    我们的脚本有以下标题:

    #!/usr/bin/perl
    use strict;   # disallow bad constructs
    use warnings; # warn about possible bugs
    
    use LWP::Simple;
    use JSON;
    

    获取JSON

    my $json_source = get "http://media1.clubpenguin.com/play/en/web_service/game_configs/paper_items.json";
    die "Can't access the JSON source" unless defined $json_source;
    

    这很简单:我们会在该网址上发送get个请求。如果输出未定义,我们会抛出一个致命的异常。

    解析JSON

    my $json = decode_json $json_source;
    

    这很容易;我们希望$json_source是一个UTF-8编码的二进制字符串。

    如果我们想检查数据结构中的内容,我们可以像

    一样打印出来
    use Data::Dumper; print Dumper $json;
    

    use Data::Dump; dd $json;
    

    如果一切按预期工作,这应该给出一系列哈希值。

    迭代

    $json是数组引用,因此我们将遍历所有项:

    my $local_path = "paper";
    my $server_path = "http://media1.clubpenguin.com/play/v2/content/global/clothing/paper";
    
    for my $item (@$json) {
      my $filename = "$item->{paper_item_id}.swf";
      my $response = mirror "$server_path/$filename" => "$local_path/$filename";
      warn "mirror failed for $filename with $response" unless $response == 200;
    }
    

    Perl有一个 references 的概念,它类似于指针。由于数据结构(如散列或数组)只能包含标量,因此仅引用其他数组或散列。给定数组引用,我们可以访问数组@$reference@{ $reference }

    要访问条目,数组的下标运算符[...]或哈希的{...}分隔符取消引用运算符->

    因此,将%hash$hashref给予相同的哈希值

    my %hash = (key => "a", otherkey => "b");
    my $hashref = \%hash;
    

    然后$hashref->{key} eq $hash{key}成立。

    因此,我们遍历@$json中的项目。所有这些项都是哈希引用,因此我们使用$item->{$key},而不是$hash{key}语法。

答案 1 :(得分:1)

您要做的是从迪士尼企鹅俱乐部游戏网站下载Shockwave Flash资源。

我无法想象迪士尼会对此感到高兴,而网站terms of use在“使用内容”(“DIMG” 迪士尼互动媒体集团< / em>的)

  

除非我们以书面形式明确同意,否则任何DIMG网站的内容均不得以任何方式使用,复制,传播,分发或以其他方式利用,而不是作为DIMG网站的一部分......

答案 2 :(得分:0)

代码未经测试。

use File::Slurp qw(read_file);
use JSON qw(decode_json);
use LWP::Simple qw(mirror);

for my $item (@{ decode_json read_file 'paper_items.json' }) {
    my $id = $item->{paper_item_id};
    mirror "http://media1.clubpenguin.com/play/v2/content/global/clothing/paper/$id.swf", "paper/$id.swf";
}