我写了这个脚本,但我不确定它是否正确。
我想要做的是通过读取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"
);
答案 0 :(得分:2)
该计划可分为三个步骤:
paper_item_id
表示到工作目录。我们将在此处使用LWP::Simple
个功能。
我们的脚本有以下标题:
#!/usr/bin/perl
use strict; # disallow bad constructs
use warnings; # warn about possible bugs
use LWP::Simple;
use 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
个请求。如果输出未定义,我们会抛出一个致命的异常。
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";
}