该程序可以分为三个步骤:
- 获取 JSON 源。
- 解析 JSON。
- 迭代解码的数据结构。我们期望一个哈希数组。将 表示的文件镜像
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 有一个引用的概念,它类似于指针。因为像散列或数组这样的数据结构只能包含标量,所以只能引用其他数组或散列。给定一个数组引用,我们可以像@$reference
or一样访问数组@{ $reference }
。
要访问条目,[...]
数组或{...}
哈希的下标运算符由解引用运算符分隔->
。
因此,给定%hash
和$hashref
相同的哈希,
my %hash = (key => "a", otherkey => "b");
my $hashref = \%hash;
然后$hashref->{key} eq $hash{key}
成立。
因此,我们循环遍历@$json
. 所有这些项目都是哈希引用,因此我们使用$item->{$key}
,而不是$hash{key}
语法。