2016-04-22 8 views
3

私はPerlでエミュレータを構築しています。私が直面している問題の1つは、コンピュータにあるJSONファイルを解析することです。私は私のサーバーからそれらを取得しようとすると、彼らは正常に動作...PerlでJSONを取得する

method getContent(\@arrURLS) { 
    my %arrInfo; 
    my $resUserAgent = Mojo::UserAgent->new; 
    foreach my $strURL (@arrURLS) { 
     $resUserAgent->get($strURL => sub { 
      my($resUserAgent, $tx) = @_; 
      if ($tx->success) { 
       my $strName = basename($strURL, '.json'); 
       my $arrData = $tx->res->body; 
       $arrInfo{$strName} = $arrData; 
      } 
      Mojo::IOLoop->stop; 
     }); 
     Mojo::IOLoop->start; 
    } 
    return \%arrInfo; 
} 

はのは@arrURLSを想定してみましょうです:

my @arrURLS = ("file:///C:/Users/Test/Desktop/JSONS/first.json", "file:///C:/Users/Test/Desktop/JSONS/second.json"); 

上記のURLのは、私は変更があれば、作業されていない1つのさんですそれは:

my @arrURLS = ("http://127.0.0.1/test/json/first.json", "http://127.0.0.1/test/json/second.json"); 

です。私はLWP::SimpleCoroを使用していたとき

また、私はそれをはるかに高速だったが、残念ながらCoroはPerlの5.22に壊れている、それは少し遅いようなのでMojo::UserAgentよりも良いものを使用したいと思います...

+2

スピードに関しては、http://www.martin-evans.me.uk/node/169に興味があります。 – simbabque

+2

'Mojo :: UserAgent'オブジェクトは' http'スキームのみをサポートします。あなたは、 'http'、' https'、 'ftp'、' file'、 'mailto'などを透過的にサポートする' LWP :: UserAgent'を代わりに使うほうが良いでしょう。 – Borodin

答えて

4

ユーザエージェントは、主にhttpでファイルをダウンロードするためのものです。彼らは通常、ファイルシステムURIを扱うことは期待されていません。自分でopenread the fileにするか、File::Slurpのようなモジュールを使用する必要があります。

このように見える可能性があります。

use File::Slurp 'read_file'; 

method getContent(\@arrURLS) { 
    my %arrInfo; 
    my $resUserAgent = Mojo::UserAgent->new; 
    foreach my $strURL (@arrURLS) { 
     if (substr($strURL, 0, 4) eq 'file') { 
      $arrInfo{basename($strURL, '.json')} = read_file($strURL); 
     } else { 
      $resUserAgent->get($strURL => sub { 
       my($resUserAgent, $tx) = @_; 
       if ($tx->success) { 
        my $strName = basename($strURL, '.json'); 
        my $arrData = $tx->res->body; 
        $arrInfo{$strName} = $arrData; 
       } 
       Mojo::IOLoop->stop; 
      }); 
      Mojo::IOLoop->start; 
     } 
    } 
    return \%arrInfo; 
} 
+0

素晴らしい作品です。 – Lucas

+1

File :: Slurpには深刻な問題があることに注意してください。https://rt.cpan.org/Public/Bug/Display.html?id=83126 –

2

自分自身でこのようなすべてのタスクにWWW::Mechanizeを使用します。ドキュメントから:

WWW :: MechanizeのははLWP :: UserAgentのの適切なサブクラスであり、あなたも はLWP :: UserAgentの者のいずれかの方法を使用することができます。

どのような意味でも、file://タイプのURLでフィードできます。

たとえば、次の1つのライナーはpasswdファイルをダンプします。

perl -MWWW::Mechanize -E 'say WWW::Mechanize->new->get("file://etc/passwd")->content' 

または任意のエラー処理なしの例

...とにかく
use 5.014; 
use warnings; 
use WWW::Mechanize; 
my $mech = WWW::Mechanize->new; 
$mech->get('file://some/path'); 
say $mech->content; 

、おそらくいくつかの file-basedユーティリティ、私自身がすべてのファイルのもの Path::Tinyモジュール、のために使用してローカルファイルのために使用することをお勧めしています

use Path::Tiny; 
my $content = path('/some/path')->slurp; 

あるいは単なるperlの:そのようなファイルをズルズルための方法を、(のみ限定されない)してい

open my $fh, '<', '/some/file' or die "..."; 
my $content = do { local $/; <$fh> }; 
close $fh; 
+1

私はPath :: Tinyアプローチが好きで、これを使ったことがありません。しかし、ダウンロードする前にたくさんのものをクリックしたくない場合は、Mechanizeをプロダクションでの簡単なダウンロード作業に使用することはお勧めしません。 – simbabque

+0

私はWeb :: Scraperが好きですが、私はTest :: flavorでMechanizeを非常に重視しています。 – simbabque

+0

@simbabque LWP :: UserAgentも同様に動作します。 – ThisSuitIsBlackNot

1

あなたが使用している追加モジュールは何ですか?私はあなたのコードはMethod::Signaturesを使用すると思うし、私はそれがMojoliciousのは、その目的のための優れたツールですが、それはHTTPのURLに重点を置いている場所で、そのモジュールで

をコンパイルすることを確認するためだけの下のコードをテストしてみました。LWP::UserAgentははるかに汎用的であり、documentation for LWPはこれを言う。

HTTPスタイルの通信のオブジェクト指向モデルを提供する。この枠組みの中で、我々は現在、HTTP、HTTPSへのアクセスをサポートし、ホリネズミ、FTP、ニュース、ファイル、およびmailtoのリソース

はあなたの方法は、このようなものになります。これは、言語がすでにデータ型を表してシギルを持っているように私はまた、Perlコードのコンテキストでハンガリアン記法をドロップすることをお勧めします

method get_content(\@urls) { 

    my %info; 

    my $ua = LWP::UserAgent->new; 

    for my $url (@urls) { 

     my $res = $ua->get($url); 
     die $res->status_line unless $res->is_success; 

     my $name  = basename($url) . '.json'; 
     my $data  = $res->decoded_content; 
     $info{$name} = $data; 
    } 

    \%info; 
} 



テストされていないのです

@arrURLSこのarrURLSが配列であるという情報を複製しますが、%arrInfoはこのarrInfoハッシュであるため間違っています。それはまたを助けるかもしれない参照し、$arrURLS[0]でもあることを、おそらくいくつかの指標が$arrDataは、実際にスカラーあるスカラー(それゆえドル)

$arrURLSを使用して、あなたを停止するには何もありません@arrURLSとは全く別の変数です)

関連する問題