2012-02-11 16 views
5

PerlプログラムでいくつかのHTTP URLを処理する必要がありますが、URIクラスがどのように役立つべきか疑問があります。Perl URIクラスはどのように使うべきですか?

特に、私はURIクラスを使用して相対URLを解決し、そのコンポーネントを取得したいと考えています。しかし、問題は、次のとおりです。

  1. 私は、引数としてURIオブジェクトとURI文字列の両方で動作する機能を必要とする(あるいは一つだけが渡されることを確認)

    sub foo_string_or_url { 
        my $uri = URI->new(shift); 
    

    その正しいアプローチですか?私はそれがURIを文字列化し、不必要に新しいオブジェクトを作成するので、それはあまり好きではありません。

  2. エキスコンポーネント

    my $host = $uri->host; 
    

    ないすべてURI sが、誰かが関数にゴミを渡す場合は特に、これはdie()を意志、ホストを持っているので、これは、また問題があります。

  3. 相対URLを解決

    my $new_url = URI::URL->new($uri, $base)->abs; 
    

    IIUC、->absせず、結果はまだ相対URLに文字列化されます(とHTTP::Request秒間動作しません)、私は右ですか?また、URIを返すことが保証されていますか?

これらの問題をどのように処理すればよいですか?可能性は

  • は私にエラーが発生しやすいと醜いようだすべての時間

    • 使用->isa('URI')->can("host")ある
  • は全くURIクラスを使用して正規表現
    • を使用してURLを解析しないでください。私はまだ自分のデバッグよりもむしろライブラリソリューションを使用するだろう
    • での
    • ラップURI動作は、第1の点

URIクラスを使用してのSANE、フールプルーフな方法があります参照してください?何かシンプルな私は考えていない(上記のリスト)?

答えて

7

あなたの質問は要約できます:パラメータの検証は面倒ですが、私はそれについて何をしますか?

  1. 私はそれも好きではありません。これは開発者の間で意見の違いがあります。他の人は強制、はスライスされたパンよりも優れていると言います。私は、1つのタイプのみを許可するとプログラムを簡素化すると主張します。また、YAGNIは大多数の場合に適用されます。間違ったタイプを拒否するには、Params::Validate/MooseX::Method::Signatures/MooseX::Declareのようなヘルパーモジュールを使用して、コードサンプルに示されている手動チェックを避けます。

  2. これは望ましい動作です。例外処理メカニズムを使用すると、状況ごとに適切なカスタムコードを記述できます。それが審美的に気に入らないと思うなら、それを取り除き、例外をチェックしないようにするという結果に気をつけてください。

    use Try::Tiny; 
    my $host; 
    try { 
        $host = $uri->host; 
    } catch { 
        warn "Could not determine host for $uri. Message was: $_. Retry/abort/ignore?\n"; 
        … 
    }; 
    
  3. はいとはい。

+3

「これらの問題をどのように処理すればよいですか」と答えたのは「常にコールアブソーズ」です。既に絶対URIがある場合は、何もしません。 – ikegami

関連する問題