-1

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

我想要做的是通过读取其内容、对其进行解码并将每个项目循环为$item. 来自具有定义为 ID 的特定 URL 的内容与该 ID$items[$i]['paper_item_id']一起保存到定义的目标中。

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

我不是要你做这项工作,只是需要帮助看看我哪里出错并为我纠正。

该脚本应该基本上解码 JSON,然后使用 ID 从某个目录 URL 将 swf 文件下载到我的 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"
  );
4

3 回答 3

2

该程序可以分为三个步骤:

  1. 获取 JSON 源。
  2. 解析 JSON。
  3. 迭代解码的数据结构。我们期望一个哈希数组。将 表示的文件镜像paper_item_id到工作目录。

我们将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在那个 URL 上发送一个请求。如果输出未定义,我们会抛出一个致命异常。

解析 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 有一个引用的概念,它类似于指针。因为像散列或数组这样的数据结构只能包含标量,所以只能引用其他数组或散列。给定一个数组引用,我们可以像@$referenceor一样访问数组@{ $reference }

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

因此,给定%hash$hashref相同的哈希,

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

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

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

于 2013-07-17T10:19:07.230 回答
1

您要做的是从 Disney's Club Penguin 游戏网站下载 Shockwave Flash 资源。

我无法想象迪斯尼会对此感到高兴,网站的使用条款在“内容使用”下这么说(“DIMG”迪斯尼互动媒体集团

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

于 2013-07-17T11:16:17.317 回答
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";
}
于 2013-07-17T10:16:16.940 回答