-1

私はこのスクリプトを書きましたが、それが正しいかどうかはわかりません。

私がやりたいことは、JSON ファイルの内容を読み取り、デコードし、各項目を としてループ処理すること$itemです。として定義された ID を持つ特定の URL からのコンテンツは、その ID で定義さ$items[$i]['paper_item_id']れた宛先に保存されます。

しかし、コードは機能していないようです。どこが間違っていたのかはわかりませんが、コードを改善して機能させるための助けやヒントがあれば良いでしょう。

私はあなたにその仕事をするように頼んでいるわけではありません。私がどこで間違っていたのかを見て、それを修正する手助けが必要なだけです.

スクリプトは基本的に JSON をデコードし、ID を使用して特定のディレクトリ URL から PC のディレクトリに swf ファイルをダウンロードする必要があります。

これがコードです

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

プログラムは次の 3 つのステップに分けることができます。

  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 には、ポインターに似た参照の概念があります。ハッシュや配列などのデータ構造にはスカラーのみを含めることができるため、他の配列やハッシュは参照されるだけです。配列参照を指定すると、@$referenceやのように配列にアクセスできます@{ $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

あなたがしようとしているのは、ディズニーのクラブ ペンギン ゲーム サイトから Shockwave Flash リソースをダウンロードすることです。

ディズニーがこれを喜ぶとは思えないし、サイトの利用規約の「コンテンツの使用」(「DIMG」ディズニー・インタラクティブ・メディア・グループ)の下にこう書いてある。

書面で明確に同意する場合を除き、DIMG サイトのコンテンツは、DIMG サイトの一部として以外の方法で使用、複製、送信、配布、またはその他の方法で利用することはできません ...

于 2013-07-17T11:16:17.317 に答える